Laravel的模型事件 入门

2020-01-24 10:03:27 浏览数 (1)

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 = [
        'AppEventsUserEvent' => [
            'AppListenersUserListener',
        ],
    ];

}

AppEventsUserEventAppListenersUserListener按照模型名称自定义修改即可。

然后运行:

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

就会生成event和listener文件:

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 AppObserver;


use AppUser;

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 AppProviders;

use AppObserverUserObserver;
use AppUser;
use IlluminateSupportServiceProvider;

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']);
});

3.静态方法

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

代码语言:javascript复制
<?php
namespace AppProviders;

class EventServiceProvider extends ServiceProvider
{

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

        });
        User::updated('AppListenerUserListener@updated');
    }
}

0 人点赞