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 。

PHP trait 特性在 Laravel 中的使用个人心得的更多相关文章

  1. Laravel中Trait的用法实例详解

    本文实例讲述了Laravel中Trait的用法.分享给大家供大家参考,具体如下: 看看PHP官方手册对Trait的定义: 自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 trait ...

  2. PHP中Trait特性

    Trait是自 PHP 5.4.0 起添加的一个新特性,是 PHP 多重继承的一种解决方案.例如,需要同时继承两个 Abstract Class, 这将会是件很麻烦的事情,Trait 就是为了解决这个 ...

  3. 如何在 Laravel 中灵活的使用 Trait

    如何在 Laravel 中灵活的使用 Trait  Laravel/ 3个月前/  1740 /  4 / 更新于 3个月前   @这是小豪的第九篇文章 好久没有更新文章了,说好了周更结果还是被自己对 ...

  4. 如何在 PHP 和 Laravel 中使用 Traits

    事实上,PHP 作为一门编程语言存在的问题之一,就是你只能使用单继承.这意味着一个类只能从另一个类中继承.例如,可能希望从几个不同的类继承方法,以防止代码重复.在 PHP 5.4 中 一个新的语言特性 ...

  5. laravel 中使用ajax和vue总结

    最近写一个项目是基于laravel框架的,这个框架传言是为艺术而创作的优雅框架,简洁分明的风格,很吸引我,所以最近研究比较多.本次就是基于该框架然后将Vue插件加入实现一定的功能,vue插件本身强大, ...

  6. 【社交系统研发日记】如何在 Laravel 中 “规范” 的开发验证码发送功能

    顺便发个小通知:7月15日ThinkSNS+开源版发布,同时非开源的APP也走出内测阶段,体验二维码也全面发布体验. 什么是ThinkSNS ? ThinkSNS(简称TS),一款全平台综合性社交系统 ...

  7. [2018-01-12] laravel中的MVC

    路由里面可以做所有事情,但是真正的项目当中,路由只用来接收请求,并转发给控制器的方法进行处理 首先我们先了解一下 一.app/Http/routes路由的用法: 方法一. 这种方法写完后在控制器创建方 ...

  8. PHP Trait特性

    php类的单继承性,无法同时从两个基类中继承属性和方法,为了解决这个问题,使用Trait特性解决. Trait是一种代码复用技术,为PHP的单继承限制提供了一套灵活的代码复用机制. 用法:通过在类中使 ...

  9. 理解Laravel中的pipeline

    理解Laravel中的pipeline suoga 关注  0.1 2015.09.08 00:00* 字数 1533 阅读 7151评论 8喜欢 24 pipeline在laravel的启动过程中出 ...

随机推荐

  1. 【codeforces 752F】Santa Clauses and a Soccer Championship

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  2. MySQL中关于OR条件的优化

    转载 MySQL在 5.0版本中引入新特性:索引合并优化(Index merge optimization),当查询中单张表可以使用多个索引时,同时扫描多个索引并将扫描结果进行合并. 该特新主要应用于 ...

  3. iOS 通讯录基础

    iOS  6 之后应用訪问通讯录须要获得用户授权,而且仅仅授权一次,即使卸载了之后再安装.也不用再次授权. 开发通讯录应用须要两个框架: 1.ABAddressBook    主要用于提供訪问通讯录中 ...

  4. js如何遍历表单所有控件

    js如何遍历表单所有控件 一.总结 一句话总结: 1.获取form表单里面的的所有元素:通过formelement.elements,这里form元素通过name属性直接定位 var fele=for ...

  5. 如何快糙好猛的使用libfacedetection库【最新版】

    前言 最近已经很少看CSDN了.这一年多准备考研,基本上怕是不会再怎么上了.以前有一个http://blog.csdn.net/mr_curry/article/details/51804072 如何 ...

  6. Erlang 命令行监控工具

    http://www.cnblogs.com/me-sa/archive/2012/11/22/erlang_vm_monitor_text_mode.html 之前介绍过一个Erlang的Web监控 ...

  7. HDU 1081 To The Max - 最大字段和

    传送门 题目大意: 求一个矩阵的最大子矩阵和. 题目分析: 刚开始考虑了一下dp方程的递推,但是不好转.简便的方法是预处理sum[i][j]表示第i行的前j个元素之和,之后\(n^3\)枚举子矩阵就可 ...

  8. 【44.19%】【codeforces 608D】Zuma

    time limit per test2 seconds memory limit per test512 megabytes inputstandard input outputstandard o ...

  9. 【codeforces 534C】Polycarpus' Dice

    [题目链接]:http://codeforces.com/contest/534/problem/C [题意] 给你n个奇怪的骰子,第i个骰子有di个面; 然后给你n个骰子的点数之和; 问你每一个骰子 ...

  10. CSS:描述样式

    一.CSS css:Cascading Style Sheet,层叠样式表,用于描述网页样式 1. 同一个标签可以有多个选择器作用,给他增加样式: 2. 有继承性,祖先的标签的一些属性,可以继承给后代 ...