php-存储库-我应该如何实现;海关;标准
我开始学习DDD等。现在我来到了存储库,但我不太确定应该如何解决以下问题:php-存储库-我应该如何实现;海关;标准,php,repository-pattern,Php,Repository Pattern,我开始学习DDD等。现在我来到了存储库,但我不太确定应该如何解决以下问题: 这是我的示例界面: interface RepositoryInterface { public function all($columns = array('*')); public function paginate($perPage = 15, $columns = array('*')); public function create(array $data); publi
这是我的示例界面:
interface RepositoryInterface {
public function all($columns = array('*'));
public function paginate($perPage = 15, $columns = array('*'));
public function create(array $data);
public function update(array $data, $id);
public function delete($id);
public function find($id, $columns = array('*'));
public function findBy($field, $value, $columns = array('*'));
}
现在我需要为模型的单个标准检索数据,例如,findActive
-我应该如何处理这种情况?将这样的方法添加到接口中,或者可以引用上述任何方法,并分别“扩展”对于我来说,findActive()方法更特定于表(模型),可以在额外的接口(例如CustomerRepositoryInterface)中定义。然后,您可以在一个特殊类(例如CustomerRepository)中“实现”这些不同的接口
以下是一个例子:
<?php
interface RepositoryInterface
{
public function all($columns = array('*'));
public function paginate($perPage = 15, $columns = array('*'));
public function create(array $data);
public function update(array $data, $id);
public function delete($id);
public function find($id, $columns = array('*'));
public function findBy($field, $value, $columns = array('*'));
}
interface CustomerRepositoryInterface extends RepositoryInterface
{
public function findActive();
}
abstract class BaseRepository implements RepositoryInterface
{
public function all($columns = array('*')) {}
public function paginate($perPage = 15, $columns = array('*')) {}
public function create(array $data) {}
public function update(array $data, $id) {}
public function delete($id) {}
public function find($id, $columns = array('*')) {}
public function findBy($field, $value, $columns = array('*')) {}
}
class CustomerRepository extends BaseRepository implements CustomerRepositoryInterface
{
public function findActive() {
echo "findActive";
}
}
$customerRepository = new CustomerRepository();
$customerRepository->findActive();
经验法则是,您的存储库类将只存储以find开头的方法。如果“查找”没有意义,那么在它前面就没有意义了。:--)看起来很棒!顺便问一下,我想问一个问题——如何处理这种关系?与您的示例相同,是否可以在特定模型的特定存储库之间应用链接?理论上,存储库对其他存储库一无所知。要处理多个存储库,我将使用一个服务类,将所有相关存储库作为依赖项。但在现实生活中,您有非常复杂的数据库查询和多个表。在本例中,我只是在“find*()”方法中使用一个查询生成器,然后连接所需的表。结果仍然是数据(行)的“收集”。该关系是使用联接表和外键定义的。