Laravel存储库模式

时间:2017-04-24 13:34:37

标签: php laravel repository-pattern

我阅读了一些关于存储库模式的文章,我想知道当我可以直接调用模型并返回数据时需要构造函数的原因?我还认为Book::all();的代码少于$this->model->all()。这只是一种好的做法还是有一些目的?

class BookRepository implements RepositoryInterface {

    private $model;

    public function __construct(Book $model)
    {
        $this->model = $model;
    }

    public function index()
    {
        return $this->model->all();
    }
}

class BookRepository implements RepositoryInterface {

    public function index()
    {
        return Book::all();
    }
}

2 个答案:

答案 0 :(得分:2)

主要原因是控制反转,基本上让您的应用程序确定应该提供什么来实现该依赖。这很重要的原因是,如果您决定重构该代码,您可以简单地告诉Laravel加载不同的实现。不需要在存储库本身中更改代码。

然而,这导致了不直接使用类的想法,而是使用接口来声明您的依赖项。这样,任何实现都可以换出,代码仍然可读。

class BookRepository {

    public function __construct(BookInterface $book)
    {
        $this->book = $book;
    }

}

现在你的Repository并不真正关心实际的类,只是它实现了book接口,它强制定义了一组特定的方法。这个好处的一个例子是,如果您使用MySQL作为Book的数据库但切换到Postgres,您可能需要显着更改底层代码,但是由于遗留原因需要保留这两个实现。您可以轻松地告诉Laravel加载标准Book课程或新PostgresBook课程,因为两个课程仍然实施BookInterface

您的存储库根本不需要更改。只需添加一个绑定即可。

另一个更直接的例子是,如果您决定要从Eloquent切换到ActiveRecord。

答案 1 :(得分:0)

两者都可以工作但是如果出于任何原因你想用任何其他模型更改模型类[Book],例如[MyBook],那么在这种情况下,你只会更改构造函数参数,而不是所有使用的函数[书]

public function __construct(MyBook $model)
{
    $this->model = $model;
}