在 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 中运行的控制器上自动执行全局函数的主要内容,如果未能解决你的问题,请参考以下文章

Yii2 中添加全局函数

[moka同学笔记]Yii2 自定义class自定义全局函数(摘录)

并行执行DynamoDB查询(全局二级索引的BatchGetItems)

如何在 yii2 中将应用资产编译为模块资产?

static的用法,全局变量与局部变量

c++存储区