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. .net remoting 抛出异常

    原文:.net remoting 抛出异常 本文告诉大家如何在使用 .net remoting 的时候,抛出异常. 所有在远程软件运行的类,如果需要传输到本地,都需要继承 MarshalByRefOb ...

  2. Struts2——(4)OGNL与struts标签

    一.OGNL Object Graphic Navigation Language  对象图导航语言 依赖于 ognl.jar包 OGNL不是Struts框架独有的,它是和框架独立的一种技术. 例如: ...

  3. Android中判断网络是否连接并提示设置

    /** * 判断网络是否连通 * @param context * @return */ public static boolean isNetworkConnected(Context contex ...

  4. Java类、实例的初始化顺序

    今晚是阿里巴巴 2013 校园招聘的杭州站笔试.下午匆忙看了两张历年试卷,去现场打了瓶酱油. 题目总体考察点偏基础,倒数第二题(Java 附加题)比较有趣,考察了 Java 初始化机制的细节,在此摘录 ...

  5. WPF动态创建Image的显示问题

    原文:WPF动态创建Image的显示问题 最近学习WPF,看到一篇教程讲解如何动态创建Image控件,自己练手时候无论如何也显示不出图片.刚开始以为是图片的路径有问题,可后来将图片的路径设为相对路径或 ...

  6. GIT 单个文件还原到历史版本号

    首先检查在历史文件中的版本号信息:git log <file> 将文件还原到历史版本号:git reset 版本号 <file> 文档工作区的检测:git checkout - ...

  7. CUDA一维纹理内存

    纹理一词来源于GPU图形世界,GPU通用并行计算"盗用"了纹理一词,定义了一个纹理内存的概念.纹理内存缓存在 设备上,在某些情况下能减少对内存的请求并降低内存带宽的使用,是专门为那 ...

  8. Gamma 函数与exponential power distribution (指数幂分布)

    1. Γ(⋅) 函数 Γ(α)=∫∞0tα−1e−tdt 可知以下基本性质: Γ(α+1)=αΓ(α) Γ(1)=1 ⇒ Γ(n+1)=n! Γ(12)=π√ 2. 指数幂分布(exponential ...

  9. Cocos2dx 温馨提示(十)三种缓存类演示

    在介绍了三级缓存,首先,我们必须弄清楚的一个问题:什么是纹理?它的通俗的解释,质感是它的含义的图片. 当图像加载到内存中后,,它是存在于纹理的形式.由于从这里可以看出.纹理事实上就是一块内存.这块内存 ...

  10. C#或者WPF中让某个窗体置顶

    原文:C#或者WPF中让某个窗体置顶 前记:在工作中有个需求,要求不管到那个界面,我必须让一个浮动条(其实是个窗体)置顶. 我用wpf,因为有之前有好几个界面已经设置成topmost了,所以在这几个界 ...