Comment passer des arguments à accéder expressions des règles dans le contrôleur cadre yu

StackOverflow https://stackoverflow.com/questions/3005708

  •  25-09-2019
  •  | 
  •  

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',
));
}
Était-ce utile?

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->... == ...;
},
...
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top