当使用其他框架或纯 PHP 时,我会保护我的模型属性。然后,我根据需要创建公共 getter 和 setter,并使用它们代理__get()
and __set()
。这有助于我晚上睡觉。
最近我开始使用 Laravel,我对 Eloquent 模型的“不受保护”程度感到惊讶。我明白我可以使用$guarded
and $fillable
属性来控制质量分配,但这仍然为意外访问留下了很大的空间。
例如,我的模型有一个status
财产。它在模型创建时设置了默认值,并且仅应在以下情况下修改:$model->activate()
or $model->deactivate()
叫做。但默认情况下,Laravel 允许开发者直接修改它。据我所知,防止这种情况的唯一方法是创建一个 setter,并在调用它时抛出异常。
我错过了什么吗?也许我只是需要放松一下?构建默认安全的 Eloquent 模型的最佳方法是什么?
您可以重写 __get 和 __set 方法。您需要定义一个数组 protectedProperties 和一个布尔变量 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 中编写类似上面的内容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)