在 yii2 中运行的控制器上自动执行全局函数
Posted
技术标签:
【中文标题】在 yii2 中运行的控制器上自动执行全局函数【英文标题】:execute global function automatically on running controller in yii2 【发布时间】:2021-12-30 20:25:33 【问题描述】:我们有网页,如果会话超时或用户注销,用户将被重定向到$this->goHome()
。我们必须销毁所有会话,所以我们必须添加一个销毁会话的函数。这个函数应该在 Yii2 中运行任何动作/控制器之前执行,即类似于 codeigniter 中的钩子。我们尝试了一个破坏会话的辅助函数,我们在 main.php
布局中将该函数称为 HomeHelper::getHelpDocUrlForCurrentPage();
,但是布局将在控制器中运行操作后执行,它应该可以运行任何控制器,因为我们有 100 多个控制器.如何实现这一点,请以正确的方式向我们提出建议。提前致谢。
【问题讨论】:
【参考方案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。
【讨论】:
以上是关于在 yii2 中运行的控制器上自动执行全局函数的主要内容,如果未能解决你的问题,请参考以下文章
[moka同学笔记]Yii2 自定义class自定义全局函数(摘录)