Laravel未触发模型事件

时间:2019-05-16 00:33:18

标签: laravel oop

我有一个继承基类并使用特征的类……我将代码放在..

在救援之前,基类基本上是用来进行验证的,为此使用了引导中的保存事件。

特征是告诉类在id属性中使用uuid。此特征使用启动的创建事件。

在类本身中,引导保存事件用于检查是否存在活动记录。

在此代码中,特征创建事件未触发...我无法进行保存,因为未生成uuid ...如果我在最后一类中使用boot方法,则会执行创建事件... < / p>

我没看到的东西...有人知道发生了什么吗?

主要班级

class AcademicYear extends BaseModel
{
    use UseUuid;

    /**
     * The "booting" method of the model.
     *
     * @return void
     */
    protected static function boot()
    {
        parent::boot();

        static::saving(function($model)
        {
            if($model->attributes['disable'] == false){
                $model->searchActiveRecord();
            }
        });
    }

    public function searchActiveRecord(){
        if ($this::where('disable', false)->count() >= 1){
            throw new \App\Exceptions\OperationNotAllowed('operation not allowed', 'there is an active record', '422');
        }

        return true;
    }
}

基本模型

class BaseModel extends Model
{
    /**
     * If the model will be validated in saving
     *
     * @var bool
     */
    protected static $validate = true;

    /**
     * Rules that will be used to validate the model
     *
     * @var array
     */
    protected $validationRules = [];

    /**
     * Create a new base model instance.
     *
     * @param  array  $attributes
     * @return void
     */
    public function __construct($attributes = [])
    {
        parent::__construct($attributes);
    }

    /**
     * The "booting" method of the model.
     *
     * @return void
     */
    protected static function boot()
    {
        parent::boot();

        static::saving(function($model)
        {
            if ($model::$validate) {
                $model->validate();
            }
        });
    }

    /**
     * Execute validation of model attributes.
     *
     * @return void
     */
    public function validate()
    {
        $validator = Validator::make($this->attributesToArray(), $this->validationRules);

        if($validator->fails()) {
            throw new \App\Exceptions\OperationNotAllowed('validation failed', $validator->messages(), '422');
        }

        return true;
    }
}

特质

trait UseUuid
{
    /**
     * The "booting" method of the model.
     *
     * @return void
     */
    protected static function boot()
    {
        parent::boot();

        static::creating(function ($model)
        {
            $model->incrementing = false;
            $model->keyType = 'string';

            $model->{$model->getKeyName()} = Str::uuid()->toString();

        });

        static::retrieved(function ($model)
        {
            $model->incrementing = false;
        });
    }
}

1 个答案:

答案 0 :(得分:2)

您的模型的boot方法与特征的boot方法冲突,因为它们的名称相同。

来自the PHP.net manual on Traits

  

从基类继承的成员被Trait插入的成员覆盖。优先顺序是当前类中的成员会覆盖Trait方法,而后者又会覆盖继承的方法。

当前课程:AcademicYear
特质:UseUuid
继承的类:BaseModel

如果要在单个模型上使用boot方法,则必须将特征的方法使用其他别名:

class AcademicYear extends BaseModel
{
    use UseUuid {
        boot as uuidBoot;
    }

    // ...

    protected static function boot()
    {
        static::uuidBoot();

        // Your model-specific boot code here.
    }
}

请注意放置parent::boot()的位置。如果同时在特征模型中调用parent::boot(),则BaseModel::boot()将被多次调用。