文档章节

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

树懒在编码
 树懒在编码
发布于 2017/04/06 17:14
字数 662
阅读 19
收藏 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 贡献源码

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

等月人
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
01/07
0
0
laravel学习(一)

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

eatnothing
2016/03/30
136
0
基于Model Event模型事件的Laravel实时APP

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

botkenni
2016/10/11
23
0

没有更多内容

加载失败,请刷新页面

加载更多

讲述下 :LVM逻辑卷管理遇到的问题

LVM学习逻辑卷管理创建逻辑卷遇到的问题 1 实验环境 系统 内核 发行版本 CentOS 2.6.32-754.2.1.el6.x86_64 CentOS release 6.10 (Final) 由于是最小化安装没有xfs命令,yum安装如下包支持此...

linuxprobe16
36分钟前
0
0
day95-20180922-英语流利阅读-待学习

Hey Jude 半个世纪传唱不衰的背后故事 毛西 2018-09-22 1.今日导读 2004 年,The Beatles 被《滚石》杂志选为“历史上最伟大的 50 位流行音乐家的第一位”。这四名来自英国利物浦的男孩不仅对...

飞鱼说编程
43分钟前
1
0
OSChina 周六乱弹 —— 放假前期焦虑症晚期

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @andonny :分享Matteo的单曲《Panama》: 《Panama》- Matteo 手机党少年们想听歌,请使劲儿戳(这里) @新垣吉衣OSC :我发现只要去有小朋友...

小小编辑
58分钟前
150
8
wait()被notify()后,接着执行wait()后面的语句

wait()被notify()后,接着执行wait()后面的语句

noteman
今天
1
0
Ubuntu集群-使用MAAS开始裸机安装

Ubuntu使用MAAS装机的七个步骤。 1、Setup your hardware You need one small server for MAAS and at least one server which can be managed with a BMC. It is recommended to have the M......

openthings
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部