我已经就另一个话题提出了this答案的问题,但我很有兴趣从中学习,所以我现在有另一个疑问。特别是,我正在查看authenticate方法和数据映射器获取方法。我还发现this回答对这个主题非常有帮助,其中解释了fetch方法,但它被跳过了我怀疑的部分。回答这些问题的用户tereško曾多次提出数据映射器中的方法不应该是fetchById,fetchByUsername等,而是一个fetch方法。我的问题是我如何获取特定的东西作为我写的方法,只有手头的域对象?
例如,如果我有一个注册服务方法,我需要检查并可能存储用户名,密码和电子邮件,我需要通过用户名来检查用户是否已经存在,然后通过电子邮件获取检查该电子邮件是否已在数据库中。那么,如果我只有:
,我怎么知道fetch方法该怎么做$mapper->fetch($object);
我是否可以在域对象上设置提取选项?
$account->setFetchOptions(['username']);
然后在fetch方法中我会检查并获取。这有道理吗?如果有人有其他想法,请分享。
答案 0 :(得分:2)
我和你不久前的位置完全一样,所以我会根据我的经验以及我目前如何解决这个问题来回答这个问题。
我已经尝试了上面显示的实现,创建域对象,设置值,然后将对象传递给fetch方法。我发现它非常冗长,所以我提出了一种新方法。基本上,如果你有一个Mappers\User
,你会在构造时将Entities\User
传递给它。当映射器将数据映射到域对象时,它简单地克隆它所持有的注入的Entities\User
对象,设置数据并返回新克隆的对象,这样我就可以得到这样的API:
public function fetchById($id);
您应该查看存储库模式,以处理比通过ID获取更复杂的查询。它为您提供了一个广泛的API,用于以各种方式获取对象或对象集合。
所以你可以拥有Repositories\User
public function fetchByUsername($username);
public function fetchByEmailAddress($emailAddress);
如何实现存储库的内部由您决定,与大多数编程模式一样,它有很多不同的内容。您的Repositories\User
可以保留您的Mappers\User
,因此当您通过用户名获取用户时,您只需使用存储库中的映射器来映射数据并返回用户。所有这些都由存储库公共接口封装。