讓我們來看兩個例子。laravel中存儲庫模式的優勢,用於在控制器構造函數中實例化模型
實施例1(Repository模式)
接口
interface FooInterface {
public function all();
}
模型(在一個鬆散的術語使用的話)
class FooModel implements FooInterface {
public function all()
{
return DB::('sometable')->get();
}
}
服務提供商
class FooServiceProvider extends ServiceProvider {
public function register()
{
$this->app->bind(
'Foo\FooInterface',
'Foo\FooModel'
);
}
配置/ app.php
'providers' => array(
// --
'Foo\FooServiceProvider'
),
,最後的控制器:
use Foo\FooInterface as Model;
public function __construct(Model $model)
{
$this->model = $model;
}
現在我可以ACCES方法爲$this->model->all()
。那很棒!我們來看第二個例子。
實施例2:
控制器:
public function __construct()
{
$this->model = new \Foo\FooModel();
}
現在我還可以訪問相同的方法$this->model->all();
問題
正如我讀到的,使用存儲庫模式的優勢在於,將來可以輕鬆配置/更改接口系統。例如
如果我更改db系統,我只需要更改綁定,服務提供商。
但,我也可以只是輕易改變模型 instaintiation在控制器構建來實現相同的。例如,將$this->model = new \Foo\FooModel()
更改爲$this->model = new \Bar\BarModel();
,其中BarModel
將保持不同系統的方法。
我很想念這裏的倉庫模式的優勢的方面究竟有什麼?或者在這種特殊情況下,存儲庫模式沒有多大優勢,但在其他情況下,它可能?如果這是肯定的,那可能是什麼情況?
p.s.術語型號僅供參考。
您不應該在構造函數中實例化對象,因爲它創建了與特定類名的緊密耦合。它與MVC無關。 –