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 。