Laravel trait的使用
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 。
Laravel trait的使用的更多相关文章
- Laravel trait 使用心得
trait 是在PHP5.4中为了方便代码复用的一种实现方式,但目前我在看的的PHP项目中较少看的有程序员去主动使用这个实现方式,在laravel中有很多 trait 的使用,关于trait 在 la ...
- BOOTING ELOQUENT MODEL TRAITS
BOOTING ELOQUENT MODEL TRAITS So I've learnt a little Laravel/Eloquent trick today that is very much ...
- Laravel 在哪些地方使用了 trait ?
laravel 框架大量使用了traits. 简单举几个例子: 在Eloquent中使用了trait .然后在model初始化的时候,有个boot方法,会自动判断当前的类用了哪些trait.然后得到一 ...
- Laravel中Trait的用法实例详解
本文实例讲述了Laravel中Trait的用法.分享给大家供大家参考,具体如下: 看看PHP官方手册对Trait的定义: 自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 trait ...
- PHP trait 特性在 Laravel 中的使用个人心得
trait 是在PHP5.4中为了方便代码复用的一种实现方式,但目前我在看的的PHP项目中较少看的有程序员去主动使用这个实现方式,在laravel中有很多 trait 的使用,关于trait 在 la ...
- 如何在 Laravel 中灵活的使用 Trait
如何在 Laravel 中灵活的使用 Trait Laravel/ 3个月前/ 1740 / 4 / 更新于 3个月前 @这是小豪的第九篇文章 好久没有更新文章了,说好了周更结果还是被自己对 ...
- Laravel 事件侦听的几个方法 [Trait, Model boot(), Observer Class]
1 Trait 1.1 可以在 Trait 中定义一个静态的 bootFooBar() 方法,注:FooBar 是你的 Trait 名称 namespace App\Traits; use App\A ...
- Laravel 项目中事件控制的体会--综合应用 trait 多态
1 我们想像有这样的需求 1.1 应用中有两个类.其一是 荣誉(Honour)其一是 档案(Archive)Honour 和 Arhcive 是多态关联.即拥有档案属性的不只荣誉类,还有更多的类去关联 ...
- TODO:Laravel增加验证码
TODO:Laravel增加验证码1. 先聊聊验证码是什么,有什么作用?验证码(CAPTCHA)是"Completely Automated Public Turing test to te ...
随机推荐
- AI-Info-Micron:人如其食:人工智能和人类微生物组
ylbtech-AI-Info-Micron:人如其食:人工智能和人类微生物组 1.返回顶部 1. 人如其食:人工智能和人类微生物组 “相信你身体发出的信号”,的确是一个很好的建议.研究人员在不遗余力 ...
- Media change : please insert the disk labeled
在Debian中使用apt-get安装软件包时经常会提示让你插入netinst的光盘: Media change: please insert the disc labeled 当没有时就无法进行安装 ...
- 【OCP-12c】2019年CUUG OCP 071考试题库(73题)
73.Which statement correctly grants a system privilege? A. GRANT CREATE VIEW ON table1 TO user1; B. ...
- Mysql Insert Or Update语法例子
有的时候会需要写一段insert的sql,如果主键存在,则update:如果主键不存在,则insert.Mysql中提供了这样的用法:ON DUPLICATE KEY UPDATE.下面就看看它是如何 ...
- deepin配置反向代理映射本地到公网
这里我是用的小米球的免费ngrok 相信deepin的新用户在配置反向代理时,会感觉到一脸茫然,因为一开始我也是这样,但经过短暂的了解了deepin后,发现,其实与在Debian上配置并没有什么区别! ...
- npm start时报错 npm ERR!Windows_NT 6.1.7601
练习webpack 时 输入 npm start就报这样的错.百度了一圈,都没有找到答案.于是,我开始看错误信息......................................../手动黑 ...
- Azure 部署K8S(二)
在"China Azure中部署Kubernetes(K8S)集群"一文中,我们使用的ACS Version及Kubernete Version版本都比较低,ACS Version ...
- C语言数据结构之图的基本操作
本博文是是博主在学习数据结构图的这一章知识时做的一些总结,代码运行环境:visual studio2017 纯C语言 ,当然掌握了方法,你也可以试着用其它的语言来实现同样的功能. 下面的程序主要实现了 ...
- HDU-1260-Tickets(线性DP,DP入门)
Tickets Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- mariadb配置主从同步遇到的问题
一:ERROR: No query specified 解决方案: \G后面不能再加分号;,因为\G在功能上等同于;,如果加了分号,那么就是;;(2个分号),SQL语法错误 二:主从同步不成功 Sla ...