PHP trait 特性在 Laravel 中的使用個人心得

麥索發表於2019-02-26

trait 是在PHP5.4中為了方便程式碼複用的一種實現方式,但目前我在看的的PHP專案中較少看的有程式設計師去主動使用這個實現方式,在laravel中有很多 trait 的使用,關於trait 在 laravel 的使用請參看 Laravel 在哪些地方用了 trait?

我曾在 Laravel 中大型專案物件導向架構 引用分享過一個他人的架構設計實踐,在他的實踐中大量使用了依賴注入。這是一種可行的方式,而同樣的使用 trait 可以實現同樣的功能,而且應用場景更多。

model 中使用

model是隨著專案的推移會慢慢的變得肥大難以維護,因為傳統的方式是將資料庫訪問邏輯都寫在這裡面,而 laravel 的模型裡除了資料訪問的邏輯還會有資料表之間的關聯關係,訪問器,修改器,監視的欄位,白名單,黑名單等等。

而當一個模型在有了這麼多東西后模型就會出現維護困難問題,當然資料訪問可以通過 資源庫模式(Repository)進行分離,但當專案已經有很多資料訪問寫在模型裡使用資源庫模式就是一個費力費時的改造工程。

而使用 trait 既可以實現程式碼分離又可以不用在邏輯層做任何處理。

我們只需要建立一個trait,將資料訪問的所有方法全部移動到這個trait中,然後在原來的模型中 use 這個trait就可以了,這樣就方便的實現了程式碼的分離。

同樣的你可以將訪問器,修改器分離,甚至是常常使用的模型定義,比如laravel的軟刪除就是用這種方式實現的,你可以自己定義一些常用的模型功能程式碼,比如內容的稽核功能。

我的建議是將model放在models資料夾中,其他trait放在models中建立的資料夾中,這樣就近的方便查詢修改,比如我就將訪問器修改器放在app/Models/Attribuite資料夾中,然後使用模型名型別名的駝峰命名檔案。 比如 User 模型的訪問器修改器我的檔案路徑就是app/Models/Attribuite/UserAttribute.php。

當然你可以分的更加細緻,把訪問器單獨定義一個trait,修改器單獨定義一個。

app/Models/Attribuite/UserGetAttribute.php app/Models/Attribuite/UserSetAttribute.php

Controller 中的使用

在laravel中有一個基類控制器裡面已經有幾個trait的使用了,比如認證,驗證器,我們在使用基類控制器時候如果有較少的基類方法可以直接寫在這個基類控制器裡,當有很多的時候維護和查詢他們也是一個麻煩事,這時候就可以用trait將他們分類出來。

而一些要複用的程式碼可能只在幾個控制器裡需要用到,這時候可以僅僅在這幾個控制器裡使用定義好的trait。

還有一種使用方式是控制器分離,當控制器中有越來越多方法時候,分離控制器中的方法也是必要的,一般的做法是新建一個控制器,然後將一些原來控制器中的方法移動過去,然後再去修改路由配置。用trait可以實現分離而不需要修改路由配置,新建一個trait將需要分離的方法移動過去,然後在原控制器中使用這個 trait 。

相關文章