前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Laravel的模型事件 入门

Laravel的模型事件 入门

作者头像
无道
发布2020-01-24 10:03:27
1.1K0
发布2020-01-24 10:03:27
举报
文章被收录于专栏:无道编程无道编程

Laravel中模型事件什么意思?

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

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

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


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


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

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

1.events属性

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

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

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

代码语言:javascript
复制
class EventServiceProvider extends ServiceProvider
{

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

}

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

然后运行:

代码语言:javascript
复制
php  artisan event:generate

就会生成event和listener文件:

截图-1577774463
截图-1577774463

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

代码语言:javascript
复制
class UserListener
{

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

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

代码语言:javascript
复制
class User extends Authenticatable
{
    use Notifiable;
    protected $events = [
        'saved' => UserEvent::class,
    ];
}

2.观察者

A. 先定义一个观察者

代码语言:javascript
复制
<?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方法中注册观察者:

代码语言:javascript
复制
<?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模型中使用

代码语言:javascript
复制
class User extends Authenticatable
{
    use Notifiable;
    protected $observables = [
        'created', 'creating', 'updating'
    ];

}

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

D. 测试成功

路由:

代码语言:javascript
复制
Route::get('/', function () {
    $user = User::find(1);
    // $user->name = 'wudao';
    // $user->save();
    $user->update(['name' => 'wudao12']);
});
截图-1577775587
截图-1577775587

3.静态方法

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

代码语言:javascript
复制
<?php
namespace App\Providers;

class EventServiceProvider extends ServiceProvider
{

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

        });
        User::updated('App\Listener\UserListener@updated');
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-12-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.events属性
  • 2.观察者
  • 3.静态方法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档