Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 这是控制器的责任还是域的责任?_Php_Model View Controller_Zend Framework_Design Patterns - Fatal编程技术网

Php 这是控制器的责任还是域的责任?

Php 这是控制器的责任还是域的责任?,php,model-view-controller,zend-framework,design-patterns,Php,Model View Controller,Zend Framework,Design Patterns,在我的应用程序中,我有用户、组织和员工。其中每个都有域对象和数据库映射器 当用户最初建立组织时,我希望自动为该用户/组织组合创建员工记录。(记录类型将为所有者)。基本上,这可以归结为两个数据库插入:一个用于组织,另一个用于员工 我可以看到两种方法: 控制器可以创建新的组织对象,并使用映射器,orgMapper::insert($newOrg),将其持久化。完成后,它可以创建新的Employee对象,并再次使用映射器,employeeMapper::insert($newOwner),进行持久化

在我的应用程序中,我有用户、组织和员工。其中每个都有域对象和数据库映射器

当用户最初建立组织时,我希望自动为该用户/组织组合创建员工记录。(记录类型将为所有者)。基本上,这可以归结为两个数据库插入:一个用于组织,另一个用于员工

我可以看到两种方法:

  • 控制器可以创建新的组织对象,并使用映射器,
    orgMapper::insert($newOrg)
    ,将其持久化。完成后,它可以创建新的Employee对象,并再次使用映射器,
    employeeMapper::insert($newOwner)
    ,进行持久化
  • 控制器可以创建新的组织对象,该对象本身完成其余工作。它将调用
    orgMapper::insert($this)
    ,然后使用返回的键创建并保存新的Employee对象
  • 第二种方法似乎有很多好处:业务逻辑(即每个新组织的员工/所有者记录)嵌入到模型中,控制器更为精简。我犹豫的唯一原因是,这意味着我的域名正变得依赖于我的映射程序

    我将使用域中的工厂来获取映射器,因此所有耦合都将归结为一个点。这是否使依赖关系可以接受?还是我有更深层次的设计问题

    我读过一些关于服务层的文章。也许这就是我应该找的地方

    我正在使用PHP和Zend框架

    非常感谢你的想法。我的猫和我已经用尽了我们自己的想法…

    因为我不是ZF用户(并且一直在避免),也许我的解决方案不适用

    数据映射器不应该只处理数据库中的一个表。相反,当您存储新的
    Organization
    条目时(我猜
    Organization
    实例包含
    Employee
    对象的集合),映射器还应该为员工创建所有条目,以及
    organizationemployees
    表中的附带数据

    简而言之:两者都不是,存储是映射者的责任。

    如果我误解了DB结构,以及它与“(..)该用户/组织组合的员工记录”以及
    Employee
    域对象与
    Organization
    完全分离的关系,那么您的第一个解决方案是可以接受的



    至于在域对象和映射器之上添加服务,这将是一个好主意。因为您已经在控制器内部泄漏了域逻辑。这似乎是件坏事。

    我可以告诉你在这种情况下我会怎么做。每当我需要获取一堆数据并从中构建多个对象时,我都会将整个混乱转储到另一个模型(可能是服务层,我不知道),并将对象从控制器中分离出来。我只是使用控制器获取数据并将其发送到其他地方(视图或模型)

    例如,我想保存音乐收藏中的一些数据,这些数据当前位于csv文件中。我的控制器解析csv文件并将每行数据放入一个数组中,我将该数组转发给一个类方法,该类方法将数据排序为对象并将其保存到数据库中。 (请注意,此方法是初步的,需要一些调整和调整)


    我希望这会有所帮助,请原谅这个例子的粗俗。

    我将更多地研究某种类型的服务层,它的唯一工作是管理db引用完整性,并将该工作从单个数据映射程序中删除。至少,尽管实现这一点所需的代码非常短,但它应该为管理在同一数据集上工作的其他项目提供可重用的编码规则。依我拙见希望我讲得通。但是,根据您使用的db软件的不同,您可能会遗漏一些db级别的功能。你在用什么数据库?@bob the destroyer,我在用mySqlwhat引擎处理这些表?Myisam还是innodb?那么,您已经获得了外键支持,所以db规范化并不完全依赖于您的PHP应用程序。尽管如此,我还是要继续研究服务层。事实上,我支持@bob the destroyer。我尽量让我的控制器看起来像一个“交通警察”。如果在一个动作中有几件事要做——要创建模型、db写入、发送电子邮件——我更喜欢将它们聚合到一个服务类中,这样控制器只需调用服务上的一个方法。
    //FROM class Application_Model_Tag
    public function saveTags() {
            //TODO implement instantiation of Domain Models instead of passing arrays to mappers
            $trackMapper  = new Music_Model_Mapper_Track();
            $artistMapper = new Music_Model_Mapper_Artist();
            $albumMapper  = new Music_Model_Mapper_Album();
    
            if (isset($this->_hash)) {
                //see if track already exists by comparing hashs
                $trackRow = $trackMapper->fetchByColumn('hash', $this->getHash());
                //if track does not exist
                if (is_null($trackRow)) {
                    //save the artist
                    $artistData = array(
                        'name' => $this->getArtist()
                    );
                    //see it the artist exists by name
                    $artistRow = $artistMapper->fetchByColumn('name', $this->getArtist());
                    //does artist exist?
                    if (is_null($artistRow)) {
                        $artistRow = $artistMapper->save($artistData);
                    }
    
                    //Save the Album Data
                    //does the album exist?
                    $albumRow = $albumMapper->fetchByColumn('name', $this->getAlbum());
                    //if yes
                    if (is_null($albumRow)) {
                        $albumData = array(
                            'name'      => $this->getAlbum(),
                            'artist_id' => $artistRow->id,
                            'art'       => $this->getAlbum() . '.jpg',
                            'year'      => $this->getYear()
                        );
                        //get album row
                        $albumRow = $albumMapper->save($albumData);
                    }
                    //Save track data
                    $trackData = array(
                        'title'     => $this->getTitle(),
                        'filename'  => $this->getFilename(),
                        'path'      => $this->getPath(),
                        'format'    => $this->getFormat(),
                        'genre'     => $this->getGenre(),
                        'artist_id' => $artistRow->id,
                        'album_id'  => $albumRow->id,
                        'track'     => $this->getTrack(),
                        'play_time' => $this->getPlay_time(),
                        'hash'      => $this->getHash()
                    );
                    //save track data
                    $trackMapper->save($trackData);
                }
            } else {
                return;
            }
        }