簡體   English   中英

Laravel 4:如何正確使用存儲庫中的模型

[英]Laravel 4: How to correctly work with Models in Repositories

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

在實現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);
    }
}

但是,這可以通過其他方式完成,而不是將Model作為依賴項注入,如下所示:

示例#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很糟糕,因為它將您的存儲庫耦合到User模型的特定實現。

每次使用存儲庫時,都需要實例化Univemba \\ Models \\ User \\ User。 Dependency Injection的整個想法是將任何依賴項注入(發送)到您的對象。 如果您的對象需要使用模型,您可以向它發送一個Laravel Eloquent模型,但您的任何同事也可能需要向其發送一個Doctrine模型。 但如果你把你的班級與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

我想,如果一個Repository旨在成為Eloquent實施的RepositoryInterface它不是一個壞主意,使用EloquentModel直接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM