Cómo pasar argumentos a las reglas de acceso en el controlador expresiones marco yü

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

  •  25-09-2019
  •  | 
  •  

Pregunta

ow para pasar argumentos al accessRules experessions a continuación el código no funciona becouse $ OWNER_ID no está definido en la clase donde se evalúa la expresión. Alguna idea de cómo solucionarlo?

public function accessRules(){
$owner_id = $this->loadModel()->owner_id;
return array(
...
        array('allow', 
                'actions'=>array('update'),
                'expression'=>'$user->id==$owner_id',
));
}
¿Fue útil?

Solución

Es muy difícil saber lo que está tratando de hacer o cuál es el problema, pero yo usaría "{}" y comillas dobles en lugar de comillas simples en la construcción de la matriz para que sus variables son interpretados correctamente:


public function accessRules(){
$owner_id = $this->loadModel()->owner_id;
return array(
...
        array('allow', 
                'actions'=>array('update'),
                'expression'=>"{$user->id}=={$owner_id}",
));
}


Otros consejos

Puede utilizar

 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;
}

En este código en función FindBYPK $ _GET [ 'post_id'] este valor desde donde obtendrá en

Se puede crear una función en el controlador actual y lo llaman en la propia expresión.

Un ejemplo de una entrada de blog:

Ponga esta función en el controlador actual, donde las reglas de acceso son.

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;
}

Y en la sección accessRules, hacer esto:

public function accessRules(){
        return array(
        ...
                array('allow', 
                        'actions'=>array('update'),
                        'expression'=>"Yii::app()->controller->isPostOwner()",
        ));
}

Espero que ayude.

A partir de PHP 5.3 se puede utilizar las funciones de un anónimo en lugar de código en una cadena

...
'expression' => function ($user) {
  return $user->... == ...;
},
...
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top