分类
laravel php web

laravel 观察者

通常,数据库中的数据被创建,修改,删除之后,我们想让他处理一些逻辑,观察者就是不错的选择。

laravel – 观察者官方文档

当前表中 有clue_ratio字段,paraent_name 表示 username的上级名称,我们想让其clue_ratio 字段和上级的保持同步,但上级的修改时,下级进行同步(公司和员工)

一、创建新的观察者类 并指定模型名

shell

php artisan make:observer SyncRadioObserver --model=AdminUser

二、

要注册观察者,可以将 ObservedBy 属性放在相应的模型上:

php

use App\Observers\UserObserver;
use Illuminate\Database\Eloquent\Attributes\ObservedBy;

#[ObservedBy([UserObserver::class])]
class User extends Authenticatable
{
    //
}

或者,您可以通过在模型上调用 observe 方法来手动注册一个观察者。你可以在应用程序的 AppServiceProvider 类的 boot 方法中注册观察者:php

use App\Models\AdminUser;
use App\Observers\SyncRadioObserver;

/**
 * 启动任何应用程序服务。
 */
public function boot(): void
{
       AdminUser::observe(SyncRadioObserver::class);

}

三、 修改观察者中的update函数

SyncRadioObserver.php
<?php
//////namespace   use
class SyncRadioObserver
{
   public function updated(AdminUser $adminUser)
    {
        AdminUser::syncRadio($adminUser);

    }

}
AdminUser.php
<?php
namespace App\Models;
use ...
class AdminUser extends Model
{
    protected $table = 'admin_users';
    protected $guarded = [];    //黑名单为空
    public static function syncRadio()
    {
        AdminUser::where('parent_name', $adminUser->username)
       ->update(['clue_ratio' => $adminUser->clue_ratio]);
    }
}

摘抄:观察者和数据库事务

当模型在数据库事务中创建时,您可能希望指示观察者仅在数据库事务提交后执行其事件处理程序。您可以通过在观察者上实现 ShouldHandleEventsAfterCommit 接口来实现这一点。如果没有正在进行的数据库事务,事件处理程序将立即执行。

<?php

namespace App\Observers;

use App\Models\AdminUser;
use Illuminate\Contracts\Events\ShouldHandleEventsAfterCommit;

class UserObserver implements ShouldHandleEventsAfterCommit
{
    /**
     * 处理 User "created" 事件。
     */
    public function created(User $user): void
    {
        // ...
    }
   public function updated(AdminUser $adminUser)
    {
        //
    }

}