laravel 框架大量使用了traits. 简单举几个例子:

在Eloquent中使用了trait 。然后在model初始化的时候,有个boot方法,会自动判断当前的类用了哪些trait。然后得到一个数组。程序会遍历这个数组,寻找有没有符合 "bootTraitName"的方法(在trait中定义),如果有就执行。

/*** Boot all of the bootable traits on the model.** @return void*/
protected static function bootTraits()
{foreach (class_uses_recursive(get_called_class()) as $trait) {if (method_exists(get_called_class(), $method = 'boot'.class_basename($trait))) {forward_static_call([get_called_class(), $method]);}}
}

Eloquent用这种方法,在初始化一个model的时候,就可以做许多自动加载. laravel自带的功能中,softDelete就是通过trait来实现的。简单来说,use了softDelete的model,会在boot的时候自动执行bootSoftDelete,然后该方法在model所有的查询都默认加入一个判断deleted_at 字段的环节,以只调取未被删除的数据。

/*** Boot the soft deleting trait for a model.** @return void*/
public static function bootSoftDeletes()
{static::addGlobalScope(new SoftDeletingScope);
}

这种做法提供了很多便利,也提供了trait的使用示范。

举个简单的例子: 我们可以用这种方法 , 给model加载一个自动清除缓存的trait . 在每一个模型每次saved之后,自动刷新它的缓存:

trait ModelCache {public static function bootModelCache(){static::saved(function($model){$cacheKey = get_class($model).'_'.$model->id;Cache::forget($cacheKey);});}}

trait在laravel的其它场景中也经常使用。例如User模型,是Laravel用来做身份验证的驱动。与身份验证的相关方法就是用一个trait来加载的。

<?phpnamespace Illuminate\Auth;trait Authenticatable
{/*** Get the unique identifier for the user.** @return mixed*/public function getAuthIdentifier(){return $this->getKey();}................./*** Get the token value for the "remember me" session.** @return string*/public function getRememberToken(){return $this->{$this->getRememberTokenName()};}}

这样当我们需要换别的模型,别的控制器做验证驱动,只要写一行use 代码,就自动得到了相关方法。

laravel使用trait还有一个比较典型的,就是dispatch。主要在laravel的controller中调用了这个trait。这样laravel的控制器就可以用$this->dispatch() 直接来调度任务。

trait DispatchesJobs
{/*** Dispatch a job to its appropriate handler.** @param  mixed  $job* @return mixed*/protected function dispatch($job){return app('Illuminate\Contracts\Bus\Dispatcher')->dispatch($job);}...........
}

任何一个类只要use了这个DispatchJob的trait,都能用同样的调度方法(其实就是用app()得到了一个dispatch的单例)。

灵活使用trait , 还是能创造各种魔法 . 我有一个设想就是通过模仿laravel的trait机制实现的 .

简单来说 , 在做一个复杂的资讯站时 , 可能要创建许多种model . 然而每个model 总有一部分模块是一样的,例如:

  • 文章(标题,作者,正文)
  • 图片组(图片,简介)
  • 视频(标题,来源,源码,简介)
  • 添加到tag
  • 相关专题
  • 等等

创建model时,重复添加这些字段是一个很头疼的工作. 而现在,我们可以用trait:

abstract class Installer {//引用文章,图片,视频相关字段的构造traituse ArticleTrait,ImageTrait,VideoTrait;/***  创建数据表*/protected function CreateTable(){//用Schema创建数据表Schema::Create($this->table,function(Blueprint $table){//生成默认字段$table = $this->makeDefaultFields($table);//生成trait中的字段$table = $this->makeTraitFields($table);});}/***   生成默认字段*/protected function makeDefaultFields(Blueprint $table){$table->increaments('id');$table->timestamps();return $table;}/***   按照trait内的方法,生成模块的字段*/protected function makeTraitFields(Blueprint $table){foreach (class_uses_recursive(get_called_class()) as $trait) {//如果trait内有 makeTraitNameFields方法, 就用该方法生成字段if (method_exists($this, $method = 'make'.class_basename($trait).'Fields')) {$table = $this->{$method}($table);}}return $table;}}

这样 , 建完几个标准的trait后, 要建其它复杂的模型,代码上就非常简单了

转载于:https://www.cnblogs.com/mouseleo/p/8674601.html

Laravel 在哪些地方使用了 trait ?相关推荐

  1. Laravel 精选资源大全

    必备品 文档:Documentation API:API Reference 视频:Laracasts 新闻:Laravel News 中文文档 Laravel学院– Laravel 5.1 中文文档 ...

  2. 【laravel】laravel的基础学习笔记

    前言 好久没有写博客了,差点忘了这个坑,现在要做公司的项目,赶紧回来学习下laravel 路由 路由用白话讲就是把用户访问的地址,和你自己的控制器进行绑定,是用户能访问到你的控制器. 基本控制器 &l ...

  3. Laravel 深入核心系列教程

    前言 年底了不太忙,最近一段时间也一直在研究laravel,就想写篇关于laravel比较深一点的教程系列啥的,于是就找到站长给开了写教程的渠道.由于第一次写,写的不好,还忘大家理解.如果看的过程中有 ...

  4. php trait instanceof,Hyperf 验证 trait

    模仿Laravel的ValidatesRequest写的一个Trait,仅供参考. trait类: namespace App\Controller; use Hyperf\HttpServer\Co ...

  5. php之新特性trait详解

    废话不多说了,直接进入主题吧. 为什么要使用它,使用它有什么好处: 开发人员能够自由地在不同层次结构内独立的类中复用 method,在一定程度上弥补了单继承语言在某些情况下代码不能复用的问题. 与普通 ...

  6. php oauth2 认证,laravel之passport oauth2认证之授权码详解

    包地址 composer require laravel/passport 1.0.* config/app.php Laravel\Passport\PassportServiceProvider: ...

  7. 社交系统/社群系统ThinkSNS+ alpha.2 版本发布!

    2019独角兽企业重金招聘Python工程师标准>>> 其实,alpha.1 早上打的 tag ,晚上因为增加了两个核心功能,所以又打了 alpha.2 tag. ThinkSNS团 ...

  8. Laravel 事件侦听的几个方法 [Trait, Model boot(), Observer Class]

    1 Trait 1.1 可以在 Trait 中定义一个静态的 bootFooBar() 方法,注:FooBar 是你的 Trait 名称 namespace App\Traits; use App\A ...

  9. 分享一个 Trait 来易用 Laravel 的缓存

    求星求关注 https://github.com/deathkel/easy-cache 安装 composer require deathkel/easy-cache 使用 这个包会自动缓存使用了该 ...

  10. php调用trait方法,PHP Laravel中的Trait使用方法

    Trait是一种在单继承语言(如PHP)中重用代码的机制.Trait旨在通过使开发人员能够在生活在不同类层次结构中的多个独立类中自由地重用方法集来减少单继承的某些限制.Traits和类组合的语义以降低 ...

最新文章

  1. 首颗“机器心”成功植入近四十年后,人造心脏终于又迎来颠覆变革
  2. 人类大脑神经如何进化?寄生虫充当了隐形设计师
  3. Debian 下如何安装 Java
  4. Halcon - 测量 - 轮廓到线的距离
  5. 每天一道LeetCode-----实现LFU置换算法
  6. 数学之路(3)-机器学习(3)-机器学习算法-SVM[7]
  7. 世界粮农组织五大健康食品_粮农组织的完整形式是什么?
  8. 关于redis的持久化
  9. Proxy pattern-代理模式
  10. mmap函数_Linux中的mmap映射 [二]
  11. Android--sharepreference总结
  12. mysql 回滚 大小设置_MySQL事物提交与回滚
  13. php 按钮外观怎么改变,php 按钮样式
  14. pwnable之bof
  15. 长期对着电脑的人保护颈椎
  16. A记录、CNAME、MX记录、NS记录的区别和联系
  17. [NGUI]NGUI中的九宫格切图模式
  18. 非常不错的IOS学习网站
  19. OSChina 周五乱弹 —— 我想当个昏君
  20. 你必须要看的IT培训机构选择意见

热门文章

  1. spark架构设计编程模型 02
  2. sql2000下 分页存储过程(一)
  3. 软件开发所需要的十三个文档
  4. Git和Github详细入门教程
  5. idea中maven下载依赖包出错
  6. 正则表达式过滤多个词语并替换为相同长度的星号
  7. c++游戏编程100事列_C/C++编程笔记:C语言开发经典游戏项目《五子棋》,内含源码...
  8. 我的世界乘法计算机,《我的世界》计算器的加法和乘法器电路图文教程
  9. 滑动平均_善杰告诉您初中物理学滑动变阻器的各种作用
  10. 提升专业素养之软件工程概述