【问题标题】:Laravel real repository patternLaravel 真实仓库模式
【发布时间】:2018-06-01 23:33:48
【问题描述】:

我正在 Laravel 中实现存储库模式,并且对实现有疑问。

例如,我可以使UserRepository 类具有遵循Eloquent 标准的方法:

public function create(array $properties)
{
    return $this->entity->create($properties);
}

public function update($id, array $properties)
{
    return $this->find($id)->update($properties);
}

public function delete($id)
{
    return $this->find($id)->delete();
}

然后将那个存储库注入到我需要对我的用户做某事的地方。

我在这里看到的问题是......例如,当我这样做时,后面会发生什么:

$this->userRepository->authenticatedUser()->posts

如果通过Eloquent 调用posts 关系,这是否违反了存储库模式?

拥有一个“真正的”存储库模式是否意味着要处理通过User 模型加载的所有可能的关系?

【问题讨论】:

  • 您不再使用存储库,因此它与您在界面中指定为 authenticatedUser 的返回值有关。
  • 在我看来,任何使用“真实”存储库模式和像 Eloquent 这样的活动记录实现的尝试都需要大量复制 eloquent 模型本身。您已经可以从您的代码中看到这一点。我认为真的不值得付出努力

标签: php laravel repository-pattern


【解决方案1】:

保持干燥。在这里,您只需复制 Eloquent 已经提供的大量代码。

但是,如果调用更复杂并且您不想在整个代码库中重复逻辑,则可以使用 RepositoryPattern。

public function clientContact($clientId) {
     return \Auth::user()->manager()->superBoss()->company()->clients()->where('client_id', $clientID)->primaryContact()->firstOrFail();
}

在这种情况下,这是有道理的。

但是,如果您想要经过身份验证的用户的帖子,那么只需使用雄辩的关系即可。

$posts = \Auth::user()->posts()->get();

【讨论】:

  • 在我个人看来,有朝一日我会说“嘿,让我们用另一个 ORM 切换 Eloquent”的可能性很小!话虽如此,我会在 Laravel 中完全忽略存储库模式。但是,公司要求我进行实施,所以我必须看看什么是最好的方法
  • @Norgul 嗯,在这种情况下,您可能需要创建和适配器来处理所有事情,也许转发关系,即创建类似 github.com/bosnadev/repository 的东西。因此,如果有什么变化,您只需要修改适配器。 sourcemaking.com/design_patterns/adapter/php
猜你喜欢
  • 1970-01-01
  • 2013-06-26
  • 2014-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
  • 2013-12-29
相关资源
最近更新 更多