Como passar argumentos para as regras de acesso expressões no yii framework controlador
Pergunta
o uxo para passar argumentos para accessRules experessions O código abaixo não funciona, porque $owner_id não é definido na classe em que a expressão é avaliada.Alguma idéia de como corrigir isso?
public function accessRules(){
$owner_id = $this->loadModel()->owner_id;
return array(
...
array('allow',
'actions'=>array('update'),
'expression'=>'$user->id==$owner_id',
));
}
Solução
É muito difícil dizer o que você está tentando fazer ou qual é o problema, mas eu gostaria de usar "{}" e aspas duplas em vez de aspas simples, quando a construção de sua matriz, de modo que as variáveis que são interpretados corretamente:
public function accessRules(){
$owner_id = $this->loadModel()->owner_id;
return array(
...
array('allow',
'actions'=>array('update'),
'expression'=>"{$user->id}=={$owner_id}",
));
}
Outras dicas
Você pode usar
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;
}
Neste código na função findbypk $ _get ['post_id'] este valor de onde entrar
Você pode criar uma função no controlador atual e chamá -la na própria expressão.
Um exemplo com uma postagem no blog:
Coloque essa função no controlador atual, onde estão suas regras de acesso.
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;
}
E na seção AccessRules, você faz isso:
public function accessRules(){
return array(
...
array('allow',
'actions'=>array('update'),
'expression'=>"Yii::app()->controller->isPostOwner()",
));
}
Espero que ajude.
Como o Php 5.3 pode usar uma funções anônimas em vez de código em uma string
...
'expression' => function ($user) {
return $user->... == ...;
},
...