【问题标题】:laravel model event from trait not firing来自特征的 laravel 模型事件未触发
【发布时间】:2022-12-04 02:23:02
【问题描述】:

为什么这不起作用??还有什么我需要做的吗??? (注意:我不想从model 调用任何boot 方法)。在模型中它与booted 方法一起工作正常

// route
Route::get('/tests', function () {

    return Test::find(1)->update([
        'name' => Str::random(6)
    ]);
});

// models
namespace App\Models;

use App\Http\Traits\Sortable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Test extends Model
{
    use HasFactory;
    use Sortable;
    protected $guarded = ["id"];
}

// traits
namespace App\Http\Traits;

trait Sortable
{

    protected static function bootSort()
    {
        static::updated(function ($model) {
            dd("updated", $model->toArray());
        });
        static::updating(function ($model) {
            dd("updating", $model->toArray());
        });
        static::saving(function ($model) {
            dd("saving", $model->toArray());
        });
        static::saved(function ($model) {
            dd("saved", $model->toArray());
        });
    }
}

【问题讨论】:

  • bootSort 是什么,为什么框架会自动调用它?我从来没有使用过 trait 的引导方法,但至少你需要遵循命名约定。

标签: php laravel eloquent


【解决方案1】:

如果我想从 trait 触发模型事件,我得到了答案:我必须将引导方法名称设置为带有前缀 boot 的 trait 类名称

例如:如果我的特征名称是Sortable,则引导方法名称将是bootSortable 以下是问题的完整解决方案:

// route
Route::get('/tests', function () {

    return Test::find(1)->update([
        'name' => Str::random(6)
    ]);
});

// models
namespace AppModels;

use AppHttpTraitsSortable;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;

class Test extends Model
{
    use HasFactory;
    use Sortable;
    protected $guarded = ["id"];
}

// traits
namespace AppHttpTraits;

trait Sortable
{
    // before
    protected static function bootSort()
    // after fix
    protected static function bootSortable()
    {
        static::updated(function ($model) {
            dd("updated", $model->toArray());
        });
        static::updating(function ($model) {
            dd("updating", $model->toArray());
        });
        static::saving(function ($model) {
            dd("saving", $model->toArray());
        });
        static::saved(function ($model) {
            dd("saved", $model->toArray());
        });
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 2014-08-15
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    相关资源
    最近更新 更多