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

laravel模型-如何在模型中动态设置列值?,laravel,Laravel,创建用户时,例如使用控制器中的以下行: $user = $this->create($request->all()); 这将插入带有表单值(名称、电子邮件、密码等)的用户记录 但是如果我们想在模型和DB表上设置一个“隐藏的”用户字段/列,例如一个特殊的唯一生成的令牌(user.token),我们不想在每个控制器中都这样做 如果laravel有一个服务层,它可以在这里完成,但最好是在模型本身中完成 e、 g.捕获beforeSave回调,让一些代码生成令牌,并在将其写入数据库之前设置

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

$user = $this->create($request->all());
这将插入带有表单值(名称、电子邮件、密码等)的用户记录

但是如果我们想在模型和DB表上设置一个“隐藏的”用户字段/列,例如一个特殊的唯一生成的令牌(user.token),我们不想在每个控制器中都这样做

如果laravel有一个服务层,它可以在这里完成,但最好是在模型本身中完成

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


有什么建议吗?

可以直接在模型中定义事件侦听器。例如,将
引导
方法添加到您的
用户
型号:

/**
 * 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);
}

可以直接在模型中定义事件侦听器。例如,将
引导
方法添加到您的
用户
型号:

/**
 * 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);
}

您的意思是为始终设置的列实现一个setter,例如name,并将代码放在其中以设置其他列,例如token?这有点像黑客,但可能会奏效……还值得注意的是,仅仅因为属性是隐藏的,并不意味着它是不可填充的。只需将其添加到您的
可填充
数组中,和/或将其从
受保护的
数组中删除即可。您的意思是为始终设置的列(例如名称)实现一个setter,并将代码放在其中以设置其他列,例如令牌?这有点像黑客,但可能会奏效……还值得注意的是,仅仅因为属性是隐藏的,并不意味着它是不可填充的。只需将其添加到您的
可填充
数组中,和/或将其从
防护
数组中删除即可。您好,谢谢您的回复。如果我在我的模型中放置一个名为“beforeSave()”的函数,我可以通过引导方法调用它吗?因此,模型逻辑在一个地方(未来的开发人员将永远不会在引导中找到它)。这将类似于grails。在grails中,我只需向模型中添加方法(如“beforeUpdate”如果未来的开发人员正在使用Laravel,人们希望他们看看该框架是如何实现事件的,而不是假设它类似于另一种语言/框架。这些都是有说服力的模型。你可以使用它们,或者如果愿意的话,也可以编写自己的事件层。嗨,谢谢你的回答。如果我给你带来乐趣的话在我的模型中,如果说“beforeSave()”,我可以通过您的引导方法调用它吗?因此,模型逻辑位于一个位置(未来的开发人员将永远不会在引导中找到它)。这将类似于grails。在grails中,我可以只向模型添加方法(例如“beforeUpdate”)如果未来的开发人员正在使用Laravel,人们希望他们看看该框架是如何实现事件的,而不是假设它将类似于另一种语言/框架。这些都是有说服力的模型。你可以使用它们,或者如果愿意,可以编写自己的事件层。