Как передать аргументы для доступа к выражениям правил в контроллере фреймворка yii - PullRequest
4 голосов
/ 09 июня 2010

из-за передачи аргументов в выражения accessRules. Приведенный ниже код не работает, поскольку $ owner_id не определен в классе, где вычисляется выражение.Есть идеи как это исправить?

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

Ответы [ 5 ]

7 голосов
/ 09 июня 2010

Очень сложно сказать, что вы пытаетесь сделать или в чем проблема, но я бы использовал "{}" и двойные кавычки, а не одинарные кавычки при построении массива, чтобы ваши переменные интерпретировались правильно:


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


2 голосов
/ 24 мая 2011

Вы можете использовать

 array('allow',
            'actions'=>array('update'),
            'users'=>array(Yii::app()->user->name),
            'expression' => '(Yii::app()->user->id == ($_GET[\'id\']))',
                    ),
1 голос
/ 10 июня 2015
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;
}

в этом коде в функции FindBYPK $ _GET ['post_id'] это значение, откуда в

0 голосов
/ 02 января 2014

Начиная с PHP 5.3, можно использовать анонимные функции вместо кода в строке

...
'expression' => function ($user) {
  return $user->... == ...;
},
...
0 голосов
/ 01 марта 2012

Вы можете создать функцию в текущем контроллере и вызвать ее в самом выражении.

Пример с сообщением в блоге:

Поместите эту функцию в текущий контроллер, где ваши правила доступаare.

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

А в разделе accessRules вы делаете это:

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

Надеюсь, что поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...