4

ow to pass arguments to accessRules experessions 下面的代码不起作用,因为 $owner_id 未在评估表达式的类中定义。任何想法如何解决它?

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

5 回答 5

7

很难说出您要做什么或问题出在哪里,但是在构建数组时我会使用“{}”和双引号而不是单引号,以便正确解释变量:


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


于 2010-06-09T13:12:46.247 回答
2

您可以使用

 array('allow',
            'actions'=>array('update'),
            'users'=>array(Yii::app()->user->name),
            'expression' => '(Yii::app()->user->id == ($_GET[\'id\']))',
                    ),
于 2011-05-24T03:42:52.590 回答
1
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'] 的这段代码中,这个值将从哪里得到

于 2015-06-10T07:23:29.800 回答
0

您可以在当前控制器中创建一个函数并在表达式本身中调用它。

博客文章的示例:

将此函数放在您的访问规则所在的当前控制器中。

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()",
        ));
}

希望有帮助。

于 2012-03-01T03:28:27.907 回答
0

自 PHP 5.3 起,可以使用匿名函数而不是字符串中的代码

...
'expression' => function ($user) {
  return $user->... == ...;
},
...
于 2014-01-02T12:14:37.180 回答