Laravel的模型事件 入门

无道 2019-12-31 0 条评论 编程相关 阅读361 手机阅读

Laravel中模型事件什么意思?

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

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

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


临近期末,除了一直复习,其实还可以研究下其他东西。等到以后想要用时,不用先学,只需要翻翻文章就好。

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


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

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

截图-1577773649

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文件:

截图-1577774463

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

截图-1577775587

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

可能是我哪个姿势又没对,没测试成功....

全文完 [
有帮助?打赏
支付宝打赏
微信打赏
]
标签: laravel 事件入门
修改: 2019-12-31 15:04
这篇文章还没有评论呢~
点击刷新/生成验证码
It's me
昵称:无道
坐标:成都
性别:
一个人,一介学生,一个儿子~ 愿你我都被世界温暖以待
迷思爱 公众号

新建了个公众号,会不定期分享一些小玩意,有提升效率的办公软件、有一些黑科技的软件、或教程等等。

爷~,要不关注下~~