Comment passer des arguments à accéder expressions des règles dans le contrôleur cadre yu
Question
oe pour transmettre des arguments accessRules experessions Le code ci-dessous ne fonctionne pas becouse owner_id $ n'est pas défini dans la classe où l'expression est évaluée. Toutes les idées comment résoudre ce problème?
public function accessRules(){
$owner_id = $this->loadModel()->owner_id;
return array(
...
array('allow',
'actions'=>array('update'),
'expression'=>'$user->id==$owner_id',
));
}
La solution
Il est très difficile de dire ce que vous essayez de faire ou de ce que le problème est, mais j'utiliser « {} » et des guillemets doubles plutôt que des guillemets simples lors de la construction de votre choix afin que vos variables sont correctement interprétées:
public function accessRules(){
$owner_id = $this->loadModel()->owner_id;
return array(
...
array('allow',
'actions'=>array('update'),
'expression'=>"{$user->id}=={$owner_id}",
));
}
Autres conseils
Vous pouvez utiliser
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;
}
dans ce code en fonction findByPk $ _GET [ 'post_id'] cette valeur d'où en obtiendra
Vous pouvez créer une fonction dans le contrôleur courant et l'appeler dans l'expression elle-même.
Un exemple avec un billet de blog:
Mettre cette fonction dans le contrôleur actuel où vos règles d'accès sont.
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;
}
Et dans la section accessRules, vous faites ceci:
public function accessRules(){
return array(
...
array('allow',
'actions'=>array('update'),
'expression'=>"Yii::app()->controller->isPostOwner()",
));
}
L'espoir qui aide.
Depuis PHP 5.3 peut utiliser une fonction anonyme au lieu de code dans une chaîne
...
'expression' => function ($user) {
return $user->... == ...;
},
...