创建用户时,例如在控制器中使用以下行:
$user = $this->create($request->all());
这将插入带有表单值(名称,电子邮件,密码等)的用户记录。
但是如果我们想设置一个"隐藏"模型和数据库表上的用户字段/列,例如一个特殊的唯一生成令牌(user.token),我们不想在每个控制器中执行此操作。
如果laravel有一个服务层,可以在这里完成,但更好的方法是在模型本身中完成。
e.g。通过捕获beforeSave回调,并让一些代码生成令牌并在将其写入数据库之前设置相应的字段。我看到模型已经保存了()事件/观察者,但这看起来像是在保存之后发生的,我不想把这个逻辑放在外部类中,它属于模型,并且文档没有说是否观察者可以修改模型(在这种情况下通过设置列)
有什么建议吗?
答案 0 :(得分:2)
可以直接在模型中定义事件侦听器。例如。在boot
模型中添加User
方法:
/**
* Define model event callbacks.
*
* @return void
*/
public static function boot()
{
parent::boot();
static::saving(function ($model) {
$model->token = str_random(60);
});
}
替代方案,更详细的实施:
/**
* Define model event callbacks.
*
* @return void
*/
public static function boot()
{
parent::boot();
static::saving(function ($model) {
if (method_exists($model, 'beforeSave')) $model->beforeSave();
});
}
/**
* Before save event listener.
*
* @return void
*/
public function beforeSave()
{
$this->token = str_random(60);
}