【问题标题】:execute global function automatically on running controller in yii2在 yii2 中运行的控制器上自动执行全局函数
【发布时间】:2021-12-30 20:25:33
【问题描述】:
我们有网页,如果会话超时或用户注销,用户将被重定向到$this->goHome()。我们必须销毁所有会话,所以我们必须添加一个销毁会话的函数。这个函数应该在 Yii2 中运行任何动作/控制器之前执行,即类似于 codeigniter 中的钩子。我们尝试了一个破坏会话的辅助函数,我们在 main.php 布局中将该函数称为 HomeHelper::getHelpDocUrlForCurrentPage();,但是布局将在控制器中运行操作后执行,它应该可以运行任何控制器,因为我们有 100 多个控制器.如何实现这一点,请以正确的方式向我们提出建议。提前致谢。
【问题讨论】:
标签:
php
session
yii2
hook
helper
【解决方案1】:
在
config/main.php
你可以尝试使用'on beforeAction'
return [
'vendorPath' => dirname(dirname(__DIR__)) . '/vendor',
'bootstrap' => [
'log',
....
],
'on beforeAction' => function($event){
// your code ..
} ,
'modules' => [
....
],
...
];
【解决方案2】:
虽然@ScaisEdge 解决方案可行,但我认为应用程序配置不适合存放应用程序逻辑。
你应该使用filters来达到你想要的结果。
首先,您需要使用您的逻辑实现过滤器。比如这样:
namespace app\components\filters;
class MyFilter extends yii\base\ActionFilter
{
public function beforeAction() {
// ... your logic ...
// beforeAction method should return bool value.
// If returned value is false the action is not run
return true;
}
}
然后您想将此过滤器与任何其他behavior 附加到您要应用此过滤器的任何控制器上。或者,如果您想为每个动作/控制器应用过滤器,您可以将过滤器附加到应用程序。您可以在应用程序配置中执行此操作:
return [
'as myFilter1' => \app\components\filters\MyFilter::class,
// ... other configurations ...
];
如果其中一些可以帮助您,您也可以查看现有的 core filters。