【问题标题】:Repository pattern - Can repositories contain logic other than core CRUD存储库模式 - 存储库是否可以包含核心 CRUD 以外的逻辑
【发布时间】:2016-03-03 00:47:40
【问题描述】:

所以我知道使用存储库模式有多种原因,其中之一是抽象与数据源的交互。

我的问题是存储库方法应该是简单还是复杂。是一个纯粹用于抽象 CORE 方法的存储库,例如获取、设置、更新、删除数据源,或者可以将 getCountOfUsersThatAreDisabled 等非常小众的方法添加到存储库。好的,我的意思是这样的方法适合图片,或者我应该将它们放在存储库类之外。

// Laravel Example    

protected $user; //

public function __construct(User $user){
     $this->user = $user;
}

public function getCountOfUsersThatAreDisabled(){
     $this->user->where('disabled', 1);
}

public function find($user_id){ 
     return $this->user->find($user_id);
}

【问题讨论】:

  • ...or is okay to add very niche methods like getCountOfUsersThatAreDisabled to repositories 没关系,而且很常见。这就是那些类型的事情应该去的地方。
  • 好吧,酷。我是整个存储库概念的新手,只是确保我做对了,而不是让我的存储库类过于复杂。
  • 可以存储库方法包含最终一起用于返回结果的 sql 和过程代码。
  • 是的,存储库的全部意义在于为您的应用程序检索数据提供标准接口。只要返回相同的数据,您的方法就可以基于 ORM 模型、查询构建器或原始 SQL 查询

标签: php laravel repository-pattern


【解决方案1】:

您的方式很好,将您与模型交互的代码放在存储库中是完全可以的,事实上,这绝对是应该的方式。

但是按照你的方法:

public function getCountOfUsersThatAreDisabled(){
     $this->user->where('disabled', 1);
}

我更喜欢缩短方法名称,并添加 where-method 参数作为主要方法参数。

public function getCountOfUsers(array $where=["disabled", 1]){
     call_user_func_array([$this->user, "where"] , $where);
}

这样,您的方法更具可读性和通用性,您也可以将其用于不同的 WHERE 值,即使您想将超过 2 个参数传递给 where 方法(例如:$where= ["id", " >", 100])。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 2016-07-16
    • 1970-01-01
    相关资源
    最近更新 更多