【发布时间】:2015-01-26 00:27:05
【问题描述】:
以前我使用的 ORM 已将数据库列直接映射到类属性,这允许您查看特定属性的可见性,就像您通常会限制对某些属性的访问一样,例如密码。
使用 Eloquent 我似乎无法复制这一点,因为数据库列映射到不包含可见性的内部属性数组。
我的愿望是将用户密码的访问范围限制为仅限对象,即私有。
设置具有可见性的类属性不起作用,因为该属性超出了 Eloquent 模型属性的范围,因此该属性未映射到列。
Eloquent $hidden 和 $guarded 属性不起作用,因为它们处理大量输出(toArray、toJSON)和大量分配而不是直接分配。
我尝试使用访问器/修改器(getter/setter)来实现这一点,但结果好坏参半。
指定访问器的可见性不起作用,因为调用的访问器方法(例如 getPasswordAttribute)是从 Eloquent\Model->getAttribute 方法调用的,因此 public/protected 将始终有效,而 private 将始终失败,无论在哪里它访问的属性。
但是起作用的是阻止 Eloquent 访问器完全返回属性,因此对 $user->password 或 $user->getAttribute ('password') 的任何请求都会失败,然后有一个单独的方法,按顺序定义可见性仅在允许的范围内直接从 Eloquent 属性数组返回属性,例如
/**
* Return password string only for private scope
* @return string
*/
private function getPassword ()
{
return $this->attributes['password'];
}
/**
* Don't return password with accessor
* @param string $password Password
* @return void
* @throws Exception
*/
public function getPasswordAttribute ($password)
{
throw new Exception ('Password access denied');
}
同样的方法也适用于任何想要 setter 方法可见性的 mutators(setter)。
这看起来是正确的还是有更好的“Laravel-Approved”方式来处理这个问题? :)
【问题讨论】:
-
hidden用于将模型输出为数组/json。没有“laravel”处理它的方式,你为什么要那样做? -
我很确定隐藏你仍然可以从你的控制器(我认为)执行 $user->password,这是他试图阻止的
标签: php laravel eloquent visibility accessor