Как пройти аргументы доступа к выражениям правил в RAMING RATURCE

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

  •  25-09-2019
  •  | 
  •  

Вопрос

Для передачи аргументов к аргументам AccessRules Expecensions Код ниже не работает, потому что $ user_id не определен в классе, где выражение оценивается. Любые идеи, как это исправить?

public function accessRules(){
$owner_id = $this->loadModel()->owner_id;
return array(
...
        array('allow', 
                'actions'=>array('update'),
                'expression'=>'$user->id==$owner_id',
));
}
Это было полезно?

Решение

Очень трудно сказать, что вы пытаетесь сделать или какова проблема, но я бы использовал «{}» и двойные кавычки, а не отдельные кавычки при создании вашего массива, чтобы ваши переменные правильно интерпретируются:


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


Другие советы

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

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

В этом коде в FindBypk функция $ _get ['post_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;
}

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

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

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

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

...
'expression' => function ($user) {
  return $user->... == ...;
},
...
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top