Como passar argumentos para as regras de acesso expressões no yii framework controlador

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

  •  25-09-2019
  •  | 
  •  

Pergunta

o uxo para passar argumentos para accessRules experessions O código abaixo não funciona, porque $owner_id não é definido na classe em que a expressão é avaliada.Alguma idéia de como corrigir isso?

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

Solução

É muito difícil dizer o que você está tentando fazer ou qual é o problema, mas eu gostaria de usar "{}" e aspas duplas em vez de aspas simples, quando a construção de sua matriz, de modo que as variáveis que são interpretados corretamente:


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


Outras dicas

Você pode usar

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

Neste código na função findbypk $ _get ['post_id'] este valor de onde entrar

Você pode criar uma função no controlador atual e chamá -la na própria expressão.

Um exemplo com uma postagem no blog:

Coloque essa função no controlador atual, onde estão suas regras de acesso.

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 na seção AccessRules, você faz isso:

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

Espero que ajude.

Como o Php 5.3 pode usar uma funções anônimas em vez de código em uma string

...
'expression' => function ($user) {
  return $user->... == ...;
},
...
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top