我的 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();
}
],
],
]
];
}
令我惊讶的是,我发现了这个:
这怎么可能是真的?在评估matchCallback
时,为什么操作参数不可用?
当然 - 如何阅读它们,如果我的访问规则需要检查一个动作参数来判断,用户是否可以访问特定动作?
编辑:您当然可以使用残酷方式阅读操作参数:
echo '$_GET = '.print_r($_GET, TRUE);
但是,我不喜欢野蛮的解决方案而且它真的困扰我,为什么actionParams
在这个阶段是空的?
答案 0 :(得分:4)
Controller类具有方法bindActionParams()
,当它开始使用给定参数运行时,由 \ yii \ base \ Action 调用。所以在第一个控制器调用一个动作方法并用params运行它然后动作将它的参数绑定到控制器。但 AccessControl 检查在操作运行之前执行得更早,这就是actionParams
为空的原因。这是一个request lifecycle。正如您在执行操作之前所看到的,控制器执行过滤器,其中一个是 AccessControl 。
如果你不喜欢“野蛮”的方式,可以考虑使用Yii::$app->request->get()
来测试 isset 的参数。