在 ACF 的 matchCallback 中读取动作参数
Reading action params in ACF's matchCallback
我有一个典型/经典的 ACF 声明,在我的 app-basic 应用程序中,它使用 matchCallback
:
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
在这个阶段是空的?
控制器 class 具有方法 bindActionParams()
,当它开始 运行 使用给定参数时,它由 \yii\base\Action 调用.因此,首先控制器调用一个动作方法并 运行 它带有参数,然后动作将其参数绑定到控制器。但是 AccessControl 检查在 运行ning 之前执行得更早,这就是 actionParams
为空的原因。这是一个request lifecycle。正如您在执行操作之前看到的那样,控制器执行过滤器,其中之一是 AccessControl.
如果您不喜欢 "brutal" 方式,请考虑使用 Yii::$app->request->get()
这也将测试 isset.
的参数
我有一个典型/经典的 ACF 声明,在我的 app-basic 应用程序中,它使用 matchCallback
:
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
在这个阶段是空的?
控制器 class 具有方法 bindActionParams()
,当它开始 运行 使用给定参数时,它由 \yii\base\Action 调用.因此,首先控制器调用一个动作方法并 运行 它带有参数,然后动作将其参数绑定到控制器。但是 AccessControl 检查在 运行ning 之前执行得更早,这就是 actionParams
为空的原因。这是一个request lifecycle。正如您在执行操作之前看到的那样,控制器执行过滤器,其中之一是 AccessControl.
如果您不喜欢 "brutal" 方式,请考虑使用 Yii::$app->request->get()
这也将测试 isset.