在我的模型层中,我有数据映射器、域对象和“服务”(在模型层之外连接)。我选择实现一个domainobjectfactory和一个datamapperfactory,这让我陷入了dmdo关系中。理想情况下,数据映射器将为每个执行“get/”read“的方法返回相关域对象的实例(或实例数组),但数据映射器无权访问域对象工厂。
如果没有dm和do上的工厂模式,autoloader可以在dm中接管,这样就可以创建do的实例。但工厂是如何做到这一点的呢?
我可以想到的一个可能的解决方案是将相关域对象的实例传递给数据映射器方法,例如:

    $user = $this->domainObjectFactory->build('user');
    $mapper = $this->dataMapperFactory->build('userMapper');

    //Pass an [empty] user DO to the DM, which will be returned back
    $mapper->getById($someIDValue, $user);

这个选项看起来很脏,但是对于单get方法来说是有效的。然而,在处理返回域对象数组时,它在语义上偏离了轨道,所以很明显这不是实现这一点的最佳方法…另一个选择是允许数据映射器访问域对象工厂,但这将导致严重的lod/srp冲突。
简而言之:数据映射器如何访问域对象工厂以返回域对象?

最佳答案

我这样解决:

$user = $this->domainObjectFactory->build('user');
$mapper = $this->dataMapperFactory->build('userMapper');

$user->setName('Foobar');
$mapper->fetch( $user );
// mapper acquires entries that are related to user with name `"Foobar"`
// and loads it into the domain object

其思想是,然后从存储中检索数据,mapper使用域对象的现有参数作为条件。如果处理的是域对象列表,则可以使用works with collection s创建映射器,并将条件分配给该集合。
此外,您可能会发现this answer与您的问题间接相关。

关于php - 数据映射器应如何返回域对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11873752/

10-10 20:24