2017-04-24 9 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

主な理由は、制御の反転であるを使用するすべての機能、 ndency。これが重要な理由は、コードをリファクタリングする場合、Laravelに別の実装をロードするように指示するだけです。リポジトリ自体でコードを変更する必要はありません。

これは、クラスを直接使用せず、代わりにインターフェイスを使用して依存関係を宣言するという考え方につながります。こうすることで、実装をスワップアウトしてコードを読みやすくすることができます。

class BookRepository { 

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

} 

今、あなたのリポジトリは、実際にそれがメソッドの特定のセットに定義することを強制ブックインタフェースを実装するだけのことを、実際のクラスを気にしません。たとえば、BookをデータベースとしてMySQLを使用していても、Postgresに切り替えると、基本的なコードを大幅に変更する必要があるかもしれませんが、両方の実装を従来の理由で保つ必要がある場合があります。標準Bookクラス、またはPostgresBookクラスをロードするようにLaravelに指示することは簡単です。まだ両方ともBookInterfaceが実装されているためです。

リポジトリはまったく変更する必要はありません。バインドを追加するだけで良いです。

もう1つ直接的な例は、EloquentからActiveRecordに切り替えることを決めた場合です。

0

の両方が動作しますが、何らかの理由であなたが[のMyBook]例えば、他のモデルとモデルクラス[ブック]を変更したい場合ので、この場合は、あなたが変更されます基本的に、アプリケーションがそのDEPEを満たすために提供されるべきかを決定させるだけコンストラクタのパラメータ、ない【予約】

public function __construct(MyBook $model) 
{ 
    $this->model = $model; 
} 
関連する問題