2017-04-24 75 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; 
}