Как пройти аргументы доступа к выражениям правил в RAMING RATURCE
Вопрос
Для передачи аргументов к аргументам AccessRules Expecensions Код ниже не работает, потому что $ user_id не определен в классе, где выражение оценивается. Любые идеи, как это исправить?
public function accessRules(){
$owner_id = $this->loadModel()->owner_id;
return array(
...
array('allow',
'actions'=>array('update'),
'expression'=>'$user->id==$owner_id',
));
}
Решение
Очень трудно сказать, что вы пытаетесь сделать или какова проблема, но я бы использовал «{}» и двойные кавычки, а не отдельные кавычки при создании вашего массива, чтобы ваши переменные правильно интерпретируются:
public function accessRules(){
$owner_id = $this->loadModel()->owner_id;
return array(
...
array('allow',
'actions'=>array('update'),
'expression'=>"{$user->id}=={$owner_id}",
));
}
Другие советы
Вы можете использовать
array('allow',
'actions'=>array('update'),
'users'=>array(Yii::app()->user->name),
'expression' => '(Yii::app()->user->id == ($_GET[\'id\']))',
),
function isPostOwner() {
$post = Post::model()->findByPk($_GET['post_id']);
$owner_id = $post->owner_id;
if(Yii::app()->user->id === $owner_id)
return true;
return false;
}
В этом коде в FindBypk функция $ _get ['post_id'] Это значение откуда в получении
Вы можете создать функцию в текущем контроллере и вызовите его в самом выражении.
Пример с постом блога:
Поместите эту функцию в текущем контроллере, где являются ваши правила доступа.
function isPostOwner() {
$post = Post::model()->findByPk($_GET['post_id']);
$owner_id = $post->owner_id;
if(Yii::app()->user->id === $owner_id)
return true;
return false;
}
А в разделе AccessRules вы делаете это:
public function accessRules(){
return array(
...
array('allow',
'actions'=>array('update'),
'expression'=>"Yii::app()->controller->isPostOwner()",
));
}
Надеюсь, это поможет.
Поскольку PHP 5.3 можно использовать анонимные функции вместо кода в строке
...
'expression' => function ($user) {
return $user->... == ...;
},
...