Laravel 中的模型事件与 Observer

模型事件

在 Laravel 的世界中,你对 Eloquent 大多数操作都会或多或少的触发一些模型事件,今天就来看一下模型事件的使用。
Laravel 事先已经定义好了 10 个模型事件以供我们使用,它们分别是:

creating, created , updating, updated, saving, saved, deleting, deleted, restoring, restored。

事件名称都很浅显易懂,相信如果你是用脑子写代码的话都应该可以看明白,如果不明白的话可以左转百度。
总结:
当模型已存在,不是新建的时候,依次触发的顺序是:

saving -> updating -> updated -> saved

当模型不存在,需要新增的时候,依次触发的顺序则是

saving -> creating -> created -> saved

Observer (观察者)
如果你想在一个模型中监听多个事件,那么你可以把它写成一个类,类中的方法名称即是你想要监听的事件名称

class UserObserver{

/**
 * 监听数据即将创建的事件。
 *
 * @param  User $user
 * @return void
 */
public function creating(User $user)
{

}

/**
 * 监听数据创建后的事件。
 *
 * @param  User $user
 * @return void
 */
public function created(User $user)
{

}

/**
 * 监听数据即将更新的事件。
 *
 * @param  User $user
 * @return void
 */
public function updating(User $user)
{

}

/**
 * 监听数据更新后的事件。
 *
 * @param  User $user
 * @return void
 */
public function updated(User $user)
{

}

/**
 * 监听数据即将保存的事件。
 *
 * @param  User $user
 * @return void
 */
public function saving(User $user)
{

}

/**
 * 监听数据保存后的事件。
 *
 * @param  User $user
 * @return void
 */
public function saved(User $user)
{

}

/**
 * 监听数据即将删除的事件。
 *
 * @param  User $user
 * @return void
 */
public function deleting(User $user)
{

}

/**
 * 监听数据删除后的事件。
 *
 * @param  User $user
 * @return void
 */
public function deleted(User $user)
{

}

/**
 * 监听数据即将从软删除状态恢复的事件。
 *
 * @param  User $user
 * @return void
 */
public function restoring(User $user)
{

}

/**
 * 监听数据从软删除状态恢复后的事件。
 *
 * @param  User $user
 * @return void
 */
public function restored(User $user)
{

}
}

然后在 AppServiceProvider 中注册此观察者

    <?php

namespace App\Providers;

use App\User;
use App\Observers\UserObserver;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
        /**
         * 运行所有应用.
         *
         * @return void
         */
        public function boot()
        {

                 // 为 User 模型注册观察者
                User::observe(UserObserver::class);
        }

        /**
         * 注册服务提供.
         *
         * @return void
         */
        public function register()
        {
                //
        }
}

然后你就可以在你注册的 Observer 中观测到各种事件啦~

本作品采用《CC 协议》,转载必须注明作者和本文链接
不要轻易放弃。学习成长的路上,我们长路漫漫,只因学无止境 Don't give up easily. On the way of learning and growing up, we have a long way to go, just because there is no end to learning.
本帖由系统于 3年前 自动加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 2

不建议写到 AppServiceProvider,
写到 Model 类的boot 方法比较好

6年前 评论

问个问题 用observer去监听模型 例如我在模型的created方法里面更新了另外一张表的数据 我这里需要transaction吗

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!