文档章节

Laravel模型基础上增加before、after事件方法

树懒在编码
 树懒在编码
发布于 2017/04/06 17:14
字数 662
阅读 40
收藏 0

Laravel框架本身没有自带beforeSave、afterSave的方法事件,但是可以自行加上这些,类似Yii框架,本身就自带这些方法,这类方法就像一个事件、触发器,可以在模型save之前,做一些属性值改变或者更多逻辑补充。

列举一下可以增加哪些before/after事件方法

  • before/afterCreate() 
  • before/afterSave()
  • before/afterUpdate()
  • before/afterDelete()
  • before/afterValidate()

如何给Model增加这些方法呢?

首先要给所有model定义一个基类,然后所有model都继承这个基类,

<?php namespace libs\Eloquent;
abstract class Model extends \Illuminate\Database\Eloquent\Model {

}

定义基类之后,我们来看看 \Illuminate\Database\Eloquent\Model,既然要添加对模型的操作,还是得深入了解一下。找到boot方法,上面有注释

/**
	 * The "booting" method of the model.("引导"模型的方法)
	 *
	 * @return void
	 */
	protected static function boot()
	{
		$class = get_called_class();

		static::$mutatorCache[$class] = array();

		// Here we will extract all of the mutated attributes so that we can quickly
		// spin through them after we export models to their array form, which we
		// need to be fast. This will let us always know the attributes mutate.
          // 在这里我们将提取的所有变异属性,这样我们可以很快旋转通过他们出口模型后数组形式,我们需要快。这将让我们永远知道变异的属性。
		foreach (get_class_methods($class) as $method)
		{
			if (preg_match('/^get(.+)Attribute$/', $method, $matches))
			{
				if (static::$snakeAttributes) $matches[1] = snake_case($matches[1]);

				static::$mutatorCache[$class][] = lcfirst($matches[1]);
			}
		}

		static::bootTraits();
	}

那么可以从这里入手,在自己定义的基类上重写一下这个方法

/**
     * The "booting" method of the model.("引导"模型方法)
     * 覆盖之前/之后附加方法挂钩到模型事件。
     * @see \Illuminate\Database\Eloquent\Model::boot()
     * @return void
     */
    public static function boot() {
        parent::boot();
        $myself   = get_called_class();
        $hooks    = array('before' => 'ing', 'after' => 'ed');
        $radicals = array('sav', 'validat', 'creat', 'updat', 'delet');
        foreach ($radicals as $rad) {
            foreach ($hooks as $hook => $event) {
                $method = $hook.ucfirst($rad).'e';
                if (method_exists($myself, $method)) {
                    $eventMethod = $rad.$event;
                    self::$eventMethod(function($model) use ($method){
                        return $model->$method($model);
                    });
                }
            }
        }
    }

接着就是其他所有的model层,举个栗子

<?php namespace ifish\Model\Ad;

use libs\Eloquent\Model;
class Ad extends Model
{

    protected $table = 'ad_ad';

    protected $guarded = ['id'];

    public $timestamps = false;

    public function beforeCreate() {
        $this->channel = 'android';
        //或者不返回,因为只有一个布尔假将停止操作
        return true;
    }
}

只要调用create方法就会触发对应事件,例如

Ad::create($data);
//调用save必须在model内增加beforeSave或者afterSave
Ad::save($data);

之前在公司项目中,大量使用mysql触发器,遇到过的应该懂的,反正就一句话,不好维护,出问题了,不好定位,之后只能改造一下,把触发器都抽离,能用before/after就用,不用可以用观察者,反正怎么灵活怎么来。

原文地址:http://www.codinglee.com/103.html

© 著作权归作者所有

共有 人打赏支持
树懒在编码
粉丝 0
博文 2
码字总数 872
作品 0
广州
后端工程师
私信 提问
Laravel框架一:原理机制篇

http://www.cnblogs.com/XiongMaoMengNan/p/6644892.html Laravel作为在国内国外都颇为流行的PHP框架,风格优雅,其拥有自己的一些特点。 一. 请求周期   Laravel 采用了单一入口模式,应用...

hisense20112784
2017/08/11
0
0
谈谈我第一次如何为 Laravel 贡献源码

起源 办法总比困难多,所以发现问题比解决问题更难得到。 事情的起源是因为在调试一段模型事件时出现的,当时随便往数据库里插入了一段字符串 ,而不是标准的 。然后发现我的模型事件中查找不...

等月人
2018/05/28
0
0
Laravel Artisan

Laravel Artisan 感谢以下网站提供的帮助 Laravel China https://laravel.com/ Laravel 5.5 中文文档 Laravel 5.4 文档 Laravel 5.1 LTS 速查表 Laravel 5.5 中文文档 Google 翻译 版本:5.5......

xiaobing1024
2018/01/07
0
0
基于Model Event模型事件的Laravel实时APP

说明:本文主要来源于real-time-apps-laravel-5-1-event-broadcasting 本文主要基于Laravel的Model Event介绍该框架的实时通信功能,Laravel模型的生命周期中包含事件:、、、、,、、、、,同...

botkenni
2016/10/11
23
0
laravel学习(一)

laravel 提供了php cli 方式进行创建model类,负责与数据库交互 ORM:即'Object Relational Mapping' 对象关系映射,ORM出现是为了帮我们把对数据库的操作变得更加方便 要在数据库交易运行一组操...

eatnothing
2016/03/30
136
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 白掌柜说了卖货不卖身

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @爱漫爱 :这是一场修行分享羽肿的单曲《Moony》 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :开不开心? 开心呀, 我又不爱睡懒觉…...

小小编辑
今天
8
0
大数据教程(11.7)hadoop2.9.1平台上仓库工具hive1.2.2搭建

上一篇文章介绍了hive2.3.4的搭建,然而这个版本已经不能稳定的支持mapreduce程序。本篇博主将分享hive1.2.2工具搭建全过程。先说明:本节就直接在上一节的hadoop环境中搭建了! 一、下载apa...

em_aaron
今天
2
0
开始看《JSP&Servlet学习笔记》

1:WEB应用简介。其中1.2.1对Web容器的工作流程写得不错 2:编写Servlet。搞清楚了Java的Web目录结构,以及Web.xml的一些配置作用。特别是讲了@WebServlet标签 3:请求与响应。更细致的讲了从...

max佩恩
今天
4
0
mysql分区功能详细介绍,以及实例

一,什么是数据库分区 前段时间写过一篇关于mysql分表的的文章,下面来说一下什么是数据库分区,以mysql为例。mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可...

吴伟祥
今天
3
0
SQL语句查询

1.1 排序 通过order by语句,可以将查询出的结果进行排序。放置在select语句的最后。 格式: SELECT * FROM 表名 ORDER BY 排序字段ASC|DESC; ASC 升序 (默认) DESC 降序 1.查询所有商品信息,...

stars永恒
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部