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年前 自动加精
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 2

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

6年前 评论

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

6年前 评论

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