2013-11-26 57 views
0

閱讀書從學徒到工匠和實施Laravel通過Chris Fidao,現在我不知道如何正確使用存儲庫中的模型。Laravel 4:如何正確使用存儲庫中的模型

實施laravel書的作者正在與模型是這樣的:

例子#1

<?php 
use MyApp\Interfaces\UserInterface; 
use Illuminate\Database\Eloquent\Model; 

class UserRepository implements UserInterface 
{ 
    protected $user; 

    public function __construct(Model $user) 
    { 
     $this->user = $user; 
    } 

    public function find($userId) 
    { 
     return $this->user->find($userId); 
    } 
} 

但是可以在其他的方式被完成,而不是注射模型作爲依賴,像此:

實施例#2 內置例如使用教程http://culttt.com/2013/07/08/creating-flexible-controllers-in-laravel-4-using-repositories/

<?php 
use MyApp\Interfaces\UserInterface; 
use MyApp\Models\User\User; 

class UserRepository implements UserInterface 
{ 
    public function find($userId) 
    { 
     return User::with('profile')->find($userId); 
    } 
} 

爲什麼在第一個示例中注入模型,爲什麼不直接使用模型如同示例二?

哪種方式是正確的,爲什麼?

另外哪種方式更易測試,集成到laravel UnitTest包中?

回答

2

示例2不好,因爲它將您的存儲庫耦合到User模型的特定實現。

每次使用存儲庫時,都需要實例化Univemba \ Models \ User \ User。依賴注入的整個思想是將注入(發送)到你的對象,無論它有什麼依賴關係。如果你的對象需要一個模型來與你一起工作,可以給它發送一個Laravel雄辯模型,但你的任何同事也可能需要發送一個模型。但是如果你將你的班級與Eloquent聯繫起來,這是不可能的。

所以在第一個例子中,沒有實例發生在你的代碼,它不是用具體類直接作爲第二:

return User::with('profile')->find($userId); 

它接收其實例化的過程中實現:

public function __construct(Model $user) 
{ 
    $this->user = $user; 
} 

有更好的方法來做到這一點,因爲它仍然期待一個具體的類,而應該期待一個接口的實現

public function __construct(ModelInterface $user) 
{ 
    $this->user = $user; 
} 

在這種情況下,你只需要傳遞給你的對象的東西,實現ModelInterface,這可能是

Univemba\Models\EloquentModel 

或者

Univemba\Models\DoctrineModel 

因爲無論將實施

Univemba\Models\ModelInterface 
0

我認爲如果Repository打算成爲Eloquent執行RepositoryInterface直接使用EloquentModel並不是一個壞主意。

相關問題