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


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 。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM