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

trait 是在PHP5.4中爲了方便代碼複用的一種實現方式,但目前我在看的的PHP項目中較少看的有程序員去主動使用這個實現方式,在laravel中有不少 trait 的使用,關於trait 在 laravel 的使用請參看 Laravel 在哪些地方用了 trait?php

我曾在 Laravel 中大型項目面向對象架構 引用分享過一個他人的架構設計實踐,在他的實踐中大量使用了依賴注入。這是一種可行的方式,而一樣的使用 trait 能夠實現一樣的功能,並且應用場景更多。laravel

model 中使用

model是隨着項目的推移會慢慢的變得肥大難以維護,由於傳統的方式是將數據庫訪問邏輯都寫在這裏面,而 laravel 的模型裏除了數據訪問的邏輯還會有數據表之間的關聯關係,訪問器,修改器,監視的字段,白名單,黑名單等等。程序員

而當一個模型在有了這麼多東西后模型就會出現維護困難問題,固然數據訪問能夠經過 資源庫模式(Repository)進行分離,但當項目已經有不少數據訪問寫在模型裏使用資源庫模式就是一個費力費時的改造工程。數據庫

而使用 trait 既能夠實現代碼分離又能夠不用在邏輯層作任何處理。架構

咱們只須要建立一個trait,將數據訪問的全部方法所有移動到這個trait中,而後在原來的模型中 use 這個trait就能夠了,這樣就方便的實現了代碼的分離。app

一樣的你能夠將訪問器,修改器分離,甚至是經常使用的模型定義,好比laravel的軟刪除就是用這種方式實現的,你能夠本身定義一些經常使用的模型功能代碼,好比內容的審覈功能。ui

個人建議是將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 。

相關文章
相關標籤/搜索