专栏首页无道编程Laravel的模型事件 入门

Laravel的模型事件 入门

Laravel中模型事件什么意思?

Laravel已经实现定义了不少的模型事件:

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

如上名称,代表在具体的模型中,当发生:正在新增、已新增、已更新...模型时,要去触发的一些事件。


Laravel中有三种方法来定义模型事件。


这里全部以用户创建时为例(creating)

数据库这些实现就创建好了:

1.events属性

无道愣是没测试成功,估计哪步没对。

就是在模型文件中定义一些属性

A. 在app/Providers/EventServiceProvider.php定义

class EventServiceProvider extends ServiceProvider
{

    protected $listen = [
        'App\Events\UserEvent' => [
            'App\Listeners\UserListener',
        ],
    ];

}

App\Events\UserEventApp\Listeners\UserListener按照模型名称自定义修改即可。

然后运行:

php  artisan event:generate

就会生成event和listener文件:

B. listen 中handle 方法注入对应事件类

class UserListener
{

    public function handle(UserEvent $event)
    {
        dd('修改什么?');
    }
}

C. 最后在 模型中添加 'events' 属性

class User extends Authenticatable
{
    use Notifiable;
    protected $events = [
        'saved' => UserEvent::class,
    ];
}

2.观察者

A. 先定义一个观察者

<?php
namespace App\Observer;


use App\User;

class UserObserver
{

    /**
     * 监听用户创建事件.
     *
     * @param User $user
     * @return void
     */
    public
    function created(User $user)
    {

    }

    /**
     * 监听用户创建/更新事件.
     *
     * @param User $user
     * @return void
     */
    public
    function saved(User $user)
    {
        //
    }
}

B. 在某个服务提供者的boot方法中注册观察者:

<?php

namespace App\Providers;

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

class AppServiceProvider extends ServiceProvider
{

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        User::observe(UserObserver::class);
    }
}

C. User模型中使用

class User extends Authenticatable
{
    use Notifiable;
    protected $observables = [
        'created', 'creating', 'updating'
    ];

}

这里的$observables属性的值和UserObserver里面定义的方法名称一样。

D. 测试成功

路由:

Route::get('/', function () {
    $user = User::find(1);
    // $user->name = 'wudao';
    // $user->save();
    $user->update(['name' => 'wudao12']);
});

3.静态方法

还可以通过模型上的对应静态方法来定义一个事件,在EventServiceProvider的boot方法里面定义:

<?php
namespace App\Providers;

class EventServiceProvider extends ServiceProvider
{

    public function boot()
    {
        parent::boot();
        User::saved(function(User$user) {

        });
        User::updated('App\Listener\UserListener@updated');
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • PHP等比缩放图片大小并转换格式

    我的一个项目需要调用一个接口上传图片,但是该接口对图像大小有一定要求,图片格式还必须是jpg。偏偏给我的原图像这两个要求都不满足。

    无道
  • (2019)[前端]面试题[9]:HTML5语义化标签和新特性

    题外话:新网站( https://www.lzpan.com )懒盘,百度云、蓝奏云资源搜索,欢迎访问。

    无道
  • Php-Laravel输入站点地图(sitemap)

    站点地图可以帮助搜索引擎更好的收录我们的站点,所以我们建站、建博客都最好有站点地图。

    无道
  • 跟我一起学Laravel-EloquentORM进阶部分

    假设User模型关联了Phone模型,要定义这样一个关联,需要在User模型中定义一个phone方法,该方法返回一个hasOne方法定义的关联

    用户2131907
  • jquery中各个属性的应用

    <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf...

    闵开慧
  • 常见样式设计及DOM操作整理

    前端博客 : alili.tech
  • 3分钟短文 | Laravel 给所有视图追加公共数据

    这又是一个深入laravel运行方式的问题,面对数百张页面,不可能所有的简单的页面 复杂的页面都继承了某些公用的layout数据。那么如何做到给所有视图都追加公...

    程序员小助手
  • 封装数组之实现在数组中查询元素和修改元素

    前言:在上一小节中,我们已经对如何往数组中添加一个元素的方法进行了编写,此节中我们就如何查询出数组中元素与修改元素的方法进行编写。

    wfaceboss
  • Mysql触发器

    数据库中除了需要定时完成一些任务外,有时我们也想在某些表数据变化时自动执行些操作,这就要用到触发器了

    剑行者
  • One order search dynamic SQL build logic

    版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)

    Jerry Wang

扫码关注云+社区

领取腾讯云代金券