5

讓我們來看兩個例子。laravel中存儲庫模式的優勢,用於在控制器構造函數中實例化模型

實施例1Repository模式

接口

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.術語型號僅供參考。

+1

您不應該在構造函數中實例化對象,因爲它創建了與特定類名的緊密耦合。它與MVC無關。 –

回答

4

這真的歸結爲你如何設置你的代碼。在你的具體情況下,似乎沒有太大的好處。

但是如果你的代碼要求你在多個不同的控制器中有多個你的模型的實例化呢?例如,也許你有一個模型到你的用戶存儲庫。可能有許多控制器需要獲取有關用戶的信息。

然後,通過所有控制器更改所有引用(即您的示例2)將是一件麻煩事。更改一次庫(比如你的例子1)更好。

從來沒有一種尺寸適合所有的編碼。你所能做的最好的是爲你現在需要的代碼編寫代碼,並意識到任何可能的解決方案,這可能有助於未來的靈活性。我的觀點是,存儲庫模式是幫助靈活性的解決方案之一。你可能永遠都不需要改變模型,或者移動到不同的數據庫,但是現在使用它編碼的努力與如果你想改變你的數據庫的麻煩相比是微不足道的。

4

爲切換數據庫做好準備是人們對存儲庫模式最討厭的論點之一。這通常跟無知的「我永遠不會切換數據庫」。如果每次我有這個對話,我都有一個贊成票...

現在想象你想添加一個後端像緩存或一些搜索引擎來優化搜索。這很適合存儲庫模式。

存儲庫模式的一般關鍵好處是與後端相關的所有更改都比其他更易於管理。

爲了說明你爲什麼不想在模型中使用這些東西;如果您想遷移模型的屬性,則需要以不同的方式從後端獲取模型。在某些情況下,您可能需要兩個模型。當你在一個模型中使用這一切時,你需要應用大量的hackery來完成這項工作。如果存儲庫管理這些更改,則模型保持清晰,並且您的代碼可以再次管理。

+0

+1,用於像'caching'這樣的存儲庫模式的獨特使用。這個用法在每個博客上都沒有解釋(或給出)(答案)。謝謝 – Tarunn

相關問題