Работая с фреймворком Yii, у меня возник вопрос, который я не могу решить самостоятельно.
Как я могу мило проверить доступ к определенным атрибутам модели?
Контекст:
email
, age
, favorite color
и т. д.), а некоторые — только пользователями с определенной ролью (is_banned
— может быть изменен модератором или администратором, balance
— могут быть изменены только администраторами и т. д.)Что я уже сделал:
На данный момент я вижу только один возможный способ решения этой задачи:
function actionUpdate($id)
{
$model = Profile::model()->findByPk($id);
if (!$this->user->checkAccess('editProfile')) {
throw new AccessDeniedException();
}
if (isset($_POST['is_banned'])) {
if (!$this->user->checkAccess('toggleBan')) {
unset($_POST['is_banned']);
}
}
if (isset($_POST['balance'])) {
if (!$this->user->checkAccess('changeBalance')) {
unset($_POST['balance']);
}
}
$model->setAttributes($_POST);
$model->save();
}
Есть ли лучшие способы решить такую задачу? Благодарю.
Рассмотрите возможность использования модельных сценариев (http://www.yiiframework.com/wiki/266/understanding-scenarios/):
Добавьте условие сценария в правила вашей модели:
правила публичных функций () { возвращаемый массив ( массив ('баланс', 'целое число', 'on' => 'admin'), ); }
Установите сценарий модели в контроллере:
if ($ this-> user-> checkAccess ('admin')) { $ model-> script = 'admin'; }
Теперь атрибуты, доступные по сценарию, сохраняются только.
Рассмотрим также использование сценариев в поисковых моделях.
Других решений пока нет …