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 。

相关文章
相关标签/搜索