Come approvare gli argomenti per accedere alle espressioni delle regole nel controller del framework YII

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

  •  25-09-2019
  •  | 
  •  

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',
));
}
È stato utile?

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->... == ...;
},
...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top