2017-05-06 98 views
3

我正在使用Repository Pattern(我對這種模式很新)的Laravel 5.4項目中工作。我有一個紅色的很多關於這個在網絡上,但我仍然有兩個重要的問題:Laravel存儲庫模式說明

>問題1:

想象一下我使用Laravel ORM Eloquent和我有類似如下的界面:

<?php 

namespace App\Repositories\User; 

interface UserRepoInterface 
{ 
    /** 
    * @param array $user 
    */ 
    public function update(array $request, User $user); 
} 

您可以看到我已經指定了一個類似參數的雄辯User模型。

的雄辯實施看起來是這樣的:

public function update(array $request, User $user) 
{ 
    $user->name    = $request['name']; 
    $user->last_name  = $request['last_name']; 
    $user->email   = $request['email']; 
    $toUpdate->save(); 
} 

所以我的問題:

這是錯誤的硬編碼在我的界面雄辯User模式?在網上的很多例子中,我看到有人在做這個,但是如果我想用基於文件的實現來交換雄辯的實現呢?這是一個問題,因爲我必須將User模型傳遞給更新方法!

如果我只申報$user而不是User $user,這個問題的解決辦法是什麼?

>問題2:

我應該如何處理分頁?

舉例來說,在我的雄辯UserRepository我有看起來像這樣的方法:

public function index() 
{ 
    return User::orderBy('name', 'asc') 
     ->withCount('messages') 
     ->with('corporation') 
     ->paginate(10); 
} 

這是錯的?我應該只在我的控制器中分頁嗎?

一個很好的解釋會幫助我很多。

回答

2

問題1

Laravel使用ActiveRecord的作爲圖案到其模型+數據訪問層。

這種模式的目的是讓事情變得更容易和更快。當你使用Repository模式時,你有點離題。要使用真正的存儲庫模式,你將不得不創建數據傳輸對象,DAT(在java中他們稱之爲POJO)。然後,使用Eloquent實體作爲實體管理器。

POPO

class User { 

    private $id; 
    private $a; 

    public setId ($id) { $this->id = $id; } 
    public getId() { return $this->id; } 

    public setA ($a) { $this->a = $a; } 
    public getA() { return $this->a; } 
} 

實體管理器

class UserEloquent extends Eloquent { 
    protected $_table = 'user'; 
} 

class EloquentUserRepository implements UserReposistory { 
    private $em; 

    public __constructor (UserEloquent $em) { $this->em = $em; } 

    public update (User $dat) { 
    $user = $em->find($dat->getId()); 
    $user->a = $dat->getA(); 
    $user->save(); 
    } 
} 

你能看見如何詳細 可不可能是?如果你真的想使用這種方法,我建議你使用Doctrine

但是,如果你想使用ActiveRecord,我建議你在rails項目上看到一些ruby!他們真的很擅長這種模式:)

現在我真的在想:做什麼對項目有好處。簡單一點,與您的團隊一起思考併爲您建立最佳實踐。不要總是使用相同的模式,因爲有人告訴過你。

如果項目規模小,速度快,請使用框架爲您提供的內容(我不是說要放鬆並製作錯誤的代碼)。如果這是一個大項目,團隊中有很多開發人員,並且您知道最終您可能需要更改數據訪問層,請考慮Repository Pattern。

當然有時候我們可以做出錯誤的架構決定,但這是我們學習的方式!並保持閱讀的模式,我認爲你是以下一個很好的路徑是一個偉大的建築師:)

問題2

這取決於你在前面已經做出了什麼決定。如果它使用ActiveRecord的雄辯,不管在哪裏調用它(控制器或一些中產階級)。只要遵循一些模式。如果您在控制器中調用,則始終在中執行此操作。否則你會迷失在你的代碼中。

使用存儲庫,我認爲裏面的存儲庫,它是好的:)