Ранее используемые мной ORM сопоставляли столбцы базы данных непосредственно с свойствами класса, что позволяло вам определять видимость определенного объекта, как обычно, чтобы ограничить доступ к определенным свойствам, например. пароли.Видимость атрибута модели Laravel/Eloquent
С Eloquent я не могу воспроизвести это, потому что столбцы базы данных отображаются в массив внутренних атрибутов, которые не содержат видимости.
Мое желание ограничить область доступа к пользовательскому паролю только объекту i.e. private.
Установка свойства класса с видимостью не работает, потому что это свойство выходит за пределы атрибутов модели Eloquent и, следовательно, свойство не отображается в столбец.
Злоумышленные $ скрытые и $ охраняемые свойства не работают, поскольку они имеют дело с массовым выходом (toArray, toJSON) и массовым назначением, а не прямым назначением.
Я попытался использовать аксессоры/мутаторы (геттеры/сеттеры), чтобы добиться этого со смешанными результатами.
Задание видимости на аксессоре не работает, потому что метод доступа, называемый (например, 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');
}
Этот же подход также работает для мутаторов (сеттеров) для тех, кто хочет видеть видимость метода сеттера.
Это похоже на правильность или есть лучший способ «разрешить Laravel» с этим? :)
'hidden' работает для вывода модели в виде массива/json. Нет никакого способа «laravel» справиться с этим, и почему вы этого хотите? –
Я уверен, что со скрытым вы все равно можете сделать $ user-> пароль от своего контроллера (я думаю), и это то, что он пытается предотвратить –