在我的应用程序中,我有用户,组织和员工。每个都有域对象和数据库映射器。
当用户最初设置组织时,我想自动为该用户/组织组合创建员工记录。 (记录的类型将是所有者)。基本上,这归结为两个数据库插入:一个用于组织,另一个用于Employee。
我可以看到两种方法:
orgMapper::insert($newOrg)
来保留它。完成后,它可以创建新的Employee对象,并再次使用映射器employeeMapper::insert($newOwner)
进行持久化。orgMapper::insert($this)
,然后使用返回的密钥创建并保留新的Employee对象。第二种方法似乎有许多好处:业务逻辑(即每个新组织的员工/所有者记录)嵌入在模型中,而控制器更加简洁。我犹豫的唯一原因是这意味着我的域名依赖于我的映射器。
我会在域中使用工厂来获取映射器,因此所有耦合都会归结为单个点。这是否可以接受依赖性?或者我有更深层次的设计问题?
我已经阅读了一些关于服务层的内容。也许这就是我应该看的地方?
我正在使用PHP和Zend Framework
非常感谢您的想法。我和我的猫已经用尽了自己的想法......
答案 0 :(得分:2)
由于我不是ZF用户(并且一直在避免使用它),也许我的解决方案不适用。
数据映射器不应该只与数据库中的单个表一起使用。相反,当您存储新的Organization
条目时(我猜Organization
实例包含Employee
个对象的集合),映射器也应该为Employees创建所有条目,并且OrganizationEmpoyees
表格中附带的数据。
简短回答:既不存储也是mapper的责任。
如果我误解了数据库结构,以及它与“(..)该用户/组织组合的员工记录”的关系,那么Employee
域对象与完全不同Organization
,那么你的第一个解决方案是可以接受的。
至于在域对象和映射器之上添加服务,这将是一个好主意。因为您已经在控制器内泄漏了域逻辑。这似乎是一件坏事。
答案 1 :(得分:0)
我可以告诉你在这样的情况下我做了什么。任何时候我需要从中获取一堆数据并构建多个对象,我将整个混乱转移到另一个模型(可能是服务层,我不知道)并将对象从控制器中分离出来。我只是使用控制器来获取数据并将其发送到其他地方(视图或模型)。
例如,我想从我的音乐集中保存一些数据,这些数据当前是在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;
}
}
我希望这会有所帮助,请原谅这个例子的粗糙。