我有一个继承基类并使用特征的类……我将代码放在..
在救援之前,基类基本上是用来进行验证的,为此使用了引导中的保存事件。
特征是告诉类在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;
});
}
}
答案 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()
将被多次调用。