存储库模式 - 存储库是否可以包含核心 CRUD 以外的逻辑


Repository pattern - Can repositories contain logic other than core CRUD

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

我的问题是存储库方法应该有多简单或复杂。是一个纯粹用于抽象 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);
}

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

但是根据您的方法:

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])。

希望这有帮助。