[英]Best practices for large models in Laravel
我已經決定重新創建一個我在Laravel中的現有網站,作為學習框架如何工作的方法,並且遇到了一個我似乎無法得到合適解釋的問題。
我目前使用我構建的自定義MVC框架。 目前,我將擁有一個擁有大量業務邏輯的“模型”。 因此,例如,在我的UserModel中,我擁有與數據庫交互的所有函數,但我還有許多與用戶相關但與數據庫沒有交互的其他函數。
是否可以將此代碼放入Eloquent模型中?
沒關系。 但是如果模型類變得太大,有時我會創建一個“管理器”對象來推卸出模型類的一些責任。 例如:
class User extends Model
{
protected $permissionManager;
public function __contruct(){
//create a Manager object (in laravel create it through App:make )
$this->permissionManager = new PermissionManager( $this );
}
}
class PermissionManager
{
protected $user;
public function __contruct(User $user){
$this->user = $user;
}
public function hasAccessTo(Resource $res){
//code
}
public function isManager(){
//code
}
}
這些管理器對象與用戶模型嚴格相關,實際上您將模型的依賴關系傳遞給管理器類的構造函數,但主要的好處是您可以避免創建“上帝”類並使用對象組合保持責任分散。
使用此結構,您可以調用:
$user->permissionManager->hasAccessTo( $resource );
您甚至可以使用接口,為User
和PermissionManager
類創建子類,並根據實例(也稱為工廠方法)在層次結構中創建不同的類型
減輕模型的另一種方法是使用Traits 。 Laravel本身在應用程序的各個部分使用特征; 看一下核心類,看看它們是如何被使用的。 由於種種原因,很多人不喜歡特征,我剛剛提出的方法的優點是它更明確地使用特征而不易發生沖突
很少有意見,但我認為將用戶相關邏輯保留在那里是可以的。 至少我在真正的大項目中看到了完全相同的方法,其中有很多膨脹的Controller / Model類。 使用單一責任原則是一個好主意,但在使用它時不要狂熱。 過度工程是邪惡的。
我建議你利用traits
。 您可以在app目錄中有一個traits
文件夾。 然后我會將每個函數分類到其單獨的文件夾中,如:
app/traits/database
文件夾中。 app/traits/misc
文件夾中。 然后我會創建一個名為UserFunctions.php
的抽象類,它將包含所有特征。 然后我將使用抽象類擴展我的User模型。
class User extends BaseUser,UserFunctions
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.