Wie man Argumente Zugriffsregeln Ausdrücke in yii Rahmen Controller übergeben

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

  •  25-09-2019
  •  | 
  •  

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',
));
}
War es hilfreich?

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->... == ...;
},
...
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top