Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php-存储库-我应该如何实现;海关;标准_Php_Repository Pattern - Fatal编程技术网

php-存储库-我应该如何实现;海关;标准

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

我开始学习DDD等。现在我来到了存储库,但我不太确定应该如何解决以下问题:
这是我的示例界面:

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*()”方法中使用一个查询生成器,然后连接所需的表。结果仍然是数据(行)的“收集”。该关系是使用联接表和外键定义的。