如何在使用引导插入数据后触发事件? (laravel)

How to fire an event after data inserted using boot? (laravel)

我正在寻找一种在 Eloquent 完成创建后触发事件的方法。

这是我在 Branch 模型中的代码:

class Branch extends Model
{
    //some code here

    public static function boot() {
        parent::boot();

        self::created(function (HistoryLog $model) { 
            $model->tag = 'Created';
            $model->description = 'This branch was created by '. ucwords(auth()->user()->name());
            $model->save();
        });
    }
}

我想做的是,我想在创建分支后创建一个 history_log。 但是这段代码returns出错了:

Symfony\Component\Debug\Exception\FatalThrowableError : Argument 1 passed to App\Vehicle::App{closure}() must be an instance of App\HistoryLog, instance of App\Vehicle given, called in D:\document\My Documents\optodph\vendor\laravel\fr amework\src\Illuminate\Events\Dispatcher.php on line 347

有人可以指出该代码有什么问题吗?实现这一目标的正确方法是什么?

$model 是创建的新记录。是 App\Vehicle 的实例而不是 App\HistoryLog

工作代码可能如下所示:

class Vehicle extends Model
{
    //some code here

    public static function boot() {
        parent::boot();

        self::created(function ($model) { 
            App\HistoryLog::create([...]);
        });
    }
}

您也可以通过 Eloquent 观察者 https://laravel.com/docs/5.8/eloquent#observers

来实现

Laravel 方法。

创建观察者:

php artisan make:observer BranchObserver --model=Branch

将您的逻辑添加到观察者:

<?php

namespace App\Observers;

use App\Branch;

class BranchObserver
{
    /**
     * Handle the Branch "created" event.
     *
     * @param  \App\Branch  $branch
     * @return void
     */
    public function created(Branch $branch)
    {
        // Add your logic here
    }
}

AppServiceProvider中注册:

<?php

namespace App\Providers;

use App\Branch;
use App\Observers\BranchObserver;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

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