gpt4 book ai didi

laravel - 如何保护 Laravel 模型属性

转载 作者:行者123 更新时间:2023-12-04 17:49:19 25 4
gpt4 key购买 nike

在使用其他框架或纯 PHP 时,我会保护我的模型属性。然后我在需要的地方创建公共(public) getter 和 setter,并使用 __get() 代理它们。和 __set() .这有助于我晚上休眠。

最近我开始使用 Laravel,我对 Eloquent 模型的“不 protected ”程度感到惊讶。我知道我可以使用 $guarded$fillable属性来控制质量分配,但这仍然为意外访问留下了很大的空间。

例如,我的模型有一个 status属性(property)。它在模型创建时设置了默认值,只有在 $model->activate() 时才应该修改。或 $model->deactivate()叫做。但是默认情况下,Laravel 允许开发人员直接修改它。据我所知,防止这种情况的唯一方法是创建一个 setter,并在调用时抛出异常。

我错过了什么吗?也许我只是需要放松一下?构建默认安全的 Eloquent 模型的最佳方法是什么?

最佳答案

您可以覆盖 __get 和 __set 方法。您需要定义一个数组 protectedProperties 和一个 bool 变量 protectedChecks,以便您可以控制模型字段。

protected $protectedChecks = true;

protected $protectedProperties = [ 'status' ];

protected $fillable = ['status'];

public function __get($key)
{
return (in_array($key, $this->fillable) && !in_array($key, $this->protectedProperties)) ? $this->attributes[$key] : null;
}

public function __set($key, $value)
{
if(!$this->protectedChecks || !in_array($key, $this->protectedProperties))
return parent::__set($key, $value);
trigger_error('Protected Field');
}

public function activate()
{
$this->protectedChecks = false;
$this->status = 1;
$this->save(); // this is optional if you want to save the model immediately
$this->protectedChecks = true;
}

如果您想使用每个模型,您应该在 BaseModel 中编写类似上面的内容。

关于laravel - 如何保护 Laravel 模型属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46376646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com