Wie man Argumente Zugriffsregeln Ausdrücke in yii Rahmen Controller übergeben
Frage
ow Argumente accessRules experessions passieren Der folgende Code funktioniert nicht becouse $ owner_id ist nicht in der Klasse definiert, in dem Ausdruck ausgewertet wird. Irgendwelche Ideen, wie man es beheben?
public function accessRules(){
$owner_id = $this->loadModel()->owner_id;
return array(
...
array('allow',
'actions'=>array('update'),
'expression'=>'$user->id==$owner_id',
));
}
Lösung
Es ist sehr schwer zu sagen, was Sie versuchen zu tun oder was das Problem ist, aber ich würde verwenden „{}“ und doppelte Anführungszeichen, anstatt einfache Anführungszeichen, wenn der Aufbau Ihre Array, so dass Ihre Variablen richtig interpretiert werden:
public function accessRules(){
$owner_id = $this->loadModel()->owner_id;
return array(
...
array('allow',
'actions'=>array('update'),
'expression'=>"{$user->id}=={$owner_id}",
));
}
Andere Tipps
Sie können mit
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 diesem Code in FindBYPK Funktion $ _GET [ 'post_id'] diesen Wert aus dem in erhalten
Sie können eine Funktion im aktuellen Controller erstellen und nennen sie in dem Ausdruck selbst.
Ein Beispiel mit einem Blog-Eintrag:
Setzen Sie diese Funktion in dem aktuellen Controller, wo Ihre Zugriffsregeln sind.
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;
}
Und im accessRules Abschnitt, Sie dies tun:
public function accessRules(){
return array(
...
array('allow',
'actions'=>array('update'),
'expression'=>"Yii::app()->controller->isPostOwner()",
));
}
Ich hoffe, das hilft.
Seit PHP 5.3 kann man eine anonymen Funktionen anstelle von Code in einem String verwenden
...
'expression' => function ($user) {
return $user->... == ...;
},
...