laravel模型 - 如何在模型中动态设置列值?

时间:2017-10-04 22:12:32

标签: laravel

创建用户时,例如在控制器中使用以下行:

$user = $this->create($request->all());

这将插入带有表单值(名称,电子邮件,密码等)的用户记录。

但是如果我们想设置一个"隐藏"模型和数据库表上的用户字段/列,例如一个特殊的唯一生成令牌(user.token),我们不想在每个控制器中执行此操作。

如果laravel有一个服务层,可以在这里完成,但更好的方法是在模型本身中完成。

e.g。通过捕获beforeSave回调,并让一些代码生成令牌并在将其写入数据库之前设置相应的字段。我看到模型已经保存了()事件/观察者,但这看起来像是在保存之后发生的,我不想把这个逻辑放在外部类中,它属于模型,并且文档没有说是否观察者可以修改模型(在这种情况下通过设置列)

有什么建议吗?

1 个答案:

答案 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);
}