这应该是控制器还是域的责任?

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

当用户最初设置组织时,我想自动为该用户/组织组合创建一条员工记录。 (记录的类型将是所有者)。 基本上这涉及到两个数据库插入:一个用于组织,另一个用于员工。

我可以看到两种方法可以解决这个问题:

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

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

    我已经读了一些关于服务层的内容。 也许这是我应该看的地方?

    我正在使用PHP和Zend Framework

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


    由于我不是ZF用户(并且一直避免它),也许我的解决方案不适用。

    数据映射器不应该只与数据库中的单个表一起工作。 相反,当你存储新的Organization条目时(我猜Organization实例包含一个Employee对象的集合),映射器也应该创建Employees的所有条目以及OrganizationEmpoyees表中的随附数据。

    简而言之: 存储不是映射器的责任。

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


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


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

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

    //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;
            }
        }
    

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

    链接地址: http://www.djcxy.com/p/61453.html

    上一篇: Should this be the responsibility of the controller or the domain?

    下一篇: How to handle Domain Entity validation before it's persisted?