[英]Laravel repository pattern explanation
我正在使用Repository Pattern
在我的Laravel 5.4
項目中工作(我對這種模式很新)。 我在網上對此有很多不滿,但我還有兩個重要問題:
>問題#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);
}
這是錯的嗎? 我應該只在控制器中分頁嗎?
一個很好的解釋會對我有所幫助。
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! 他們真的很擅長這種模式:)
現在我真正想到的是:做出對項目有益的事情。 簡單一點,與您的團隊一起思考並為您構建最佳實踐。 不要總是使用相同的模式,因為有人告訴你。
如果項目小而快,請使用框架為您提供的內容(我不是說放松並制作錯誤的代碼)。 如果這是一個大項目,團隊中有很多開發人員,並且您知道最終您可能想要更改數據訪問層,請考慮存儲庫模式。
當然,有時我們可以采取錯誤的架構決策,但這是我們學習的方式! 並繼續閱讀模式,我認為你正在追隨一個偉大的道路,成為一個偉大的建築師:)
這取決於你上面的決定。 如果它的Eloquent使用ActiveRecord,無論在哪里調用它(控制器或一些中產階級)。 只需遵循一些模式。 如果您在Controller中調用,請始終在Controller中執行此操作。 否則你會迷失在你的代碼中。
使用Repository,我認為在存儲庫中它很好:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.