Come approvare gli argomenti per accedere alle espressioni delle regole nel controller del framework YII
Domanda
Ow per passare gli argomenti alle esperienze di AccessRules Il codice seguente non funziona perché $ proprietario_id non è definito nella classe in cui viene valutata l'espressione. Qualche idea su come aggiustarlo?
public function accessRules(){
$owner_id = $this->loadModel()->owner_id;
return array(
...
array('allow',
'actions'=>array('update'),
'expression'=>'$user->id==$owner_id',
));
}
Soluzione
E 'molto difficile dire che cosa si sta cercando di fare o qual è il problema, ma vorrei usare "{}" e virgolette, piuttosto che singoli apici quando si costruisce la matrice in modo che le variabili sono interpretati correttamente:
public function accessRules(){
$owner_id = $this->loadModel()->owner_id;
return array(
...
array('allow',
'actions'=>array('update'),
'expression'=>"{$user->id}=={$owner_id}",
));
}
Altri suggerimenti
È possibile utilizzare
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;
}
In questo codice nella funzione FindBYPK $ _GET [ 'post_id'] questo valore da dove nel otterrà
È possibile creare una funzione di regolatore di corrente e chiamarlo nell'espressione stessa.
Un esempio con un post sul blog:
Mettere questa funzione nel controllo di corrente in cui le regole di accesso sono.
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 nella sezione accessRules, si esegue questa operazione:
public function accessRules(){
return array(
...
array('allow',
'actions'=>array('update'),
'expression'=>"Yii::app()->controller->isPostOwner()",
));
}
La speranza che aiuta.
A partire da PHP 5.3 si può utilizzare un funzioni anonime invece di codice in una stringa
...
'expression' => function ($user) {
return $user->... == ...;
},
...