阅读ACF的matchCallback中的动作参数

时间:2015-07-01 10:08:58

标签: php yii callback yii2 access-control

我的 app-basic 应用程序中有一个使用matchCallback的典型/经典ACF声明:

public function behaviors()
{
    return [
        'access' => [
            'class' => AccessControl::className(),
            'rules' => [
                [
                    'allow' => true,
                    'roles' => ['@'],
                    'matchCallback' => function ($rule, $action) {
                        echo 'Yii::$app->controller->actionParams = '.print_r(Yii::$app->controller->actionParams, TRUE);
                        echo '$action->controller->actionParams = '.print_r($action->controller->actionParams, TRUE);
                        echo '$action = '.print_r($action, TRUE);
                        die();
                    }
                ],
            ],
        ]
    ];
}

令我惊讶的是,我发现了这个:

enter image description here

这怎么可能是真的?在评估matchCallback时,为什么操作参数不可用?

当然 - 如何阅读它们,如果我的访问规则需要检查一个动作参数来判断,用户是否可以访问特定动作?

编辑:您当然可以使用残酷方式阅读操作参数:

echo '$_GET = '.print_r($_GET, TRUE);

但是,我不喜欢野蛮的解决方案而且它真的困扰我,为什么actionParams在这个阶段是空的?

1 个答案:

答案 0 :(得分:4)

Controller类具有方法bindActionParams(),当它开始使用给定参数运行时,由 \ yii \ base \ Action 调用。所以在第一个控制器调用一个动作方法并用params运行它然后动作将它的参数绑定到控制器。但 AccessControl 检查在操作运行之前执行得更早,这就是actionParams为空的原因。这是一个request lifecycle。正如您在执行操作之前所看到的,控制器执行过滤器,其中一个是 AccessControl

如果你不喜欢“野蛮”的方式,可以考虑使用Yii::$app->request->get()来测试 isset 的参数。