【问题标题】:Data Mapper fetch method数据映射器获取方法
【发布时间】:2014-04-21 19:47:17
【问题描述】:

我已经问过一个关于 this 回答另一个话题的问题,但我有点想从中学习,所以我现在有另一个疑问。特别是,我正在查看身份验证方法和数据映射器获取方法。我还发现this 的答案对这个主题非常有帮助,其中解释了 fetch 方法,但它被跳过了我有疑问的部分。回答这个问题的用户 tereško 有几次建议数据映射器中的方法不应该是 fetchById、fetchByUsername 等,而应该是一个 fetch 方法。我的问题是我要如何获取特定的东西作为我写的方法,手头只有域对象?

例如,如果我有一个注册服务方法,我需要检查并可能存储用户名、密码和电子邮件,我需要通过用户名获取来检查用户是否已经存在,然后通过电子邮件获取到检查该电子邮件是否已经在数据库中。那么,我怎么知道在 fetch 方法中如果我只有:

$mapper->fetch($object);

我是否可以在域对象上设置获取选项?

$account->setFetchOptions(['username']);

然后在 fetch 方法中我会检查并获取。这有意义吗?如果有人有其他想法,请分享。

【问题讨论】:

    标签: php model-view-controller datamapper


    【解决方案1】:

    不久前我和你处于完全相同的位置,所以我将根据我的经验以及我目前如何解决这个问题来回答这个问题。

    我已经对您上面展示的实现进行了试验,创建了一个域对象,设置了值,然后将对象传递给 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,因此当您通过用户名获取用户时,您只需使用存储库中的映射器来映射数据并返回用户。所有这些都由存储库公共接口封装。

    【讨论】:

    • 非常感谢大卫,我发现您的回答很有帮助。我一定会考虑的。我今天再次研究,我遇到了这个answer,他说: $mapper->use_filter($filter)->fetch($something) 这似乎有点类似于我的建议,但我'我仍然不太确定什么是正确的.. 另外,我发现这个 answer 上面写着:$mapper->fetch($user, 'uid')
    • 呵呵..这两篇文章相隔两年。我实际上很想重写或删除旧的,因为它看起来真的很糟糕=/
    • @tereško 如果你要重写它会非常好,尽管我认为它并没有那么糟糕。如果您决定删除它,那么也许您可以扩展这个问题并在这个主题上提供帮助:P
    猜你喜欢
    • 2022-08-14
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多