2017-04-24 76 views
0

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

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(); 
    } 
} 

回答

1

的主要原因是控制反转,基本上让您的应用程序确定应提供履行这一DEPE ndency。这很重要的原因是,如果您决定重构该代码,您可以简单地告诉Laravel加载不同的实现。代码库本身不需要修改代码。

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

class BookRepository { 

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

} 

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

您的存储库根本不需要改变。只需添加一个绑定,你就很好。

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

0

双方将工作,但如果您有任何理由要与其他型号例如[MyBook]改变模型类[图书]所以在这种情况下,你会改变只有构造函数的参数,并非所有的功能,这使用[图书]

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