【问题标题】:Yii Framework action before every controller每个控制器之前的 Yii 框架动作
【发布时间】:2017-03-07 08:24:10
【问题描述】:

是否有任何“主”控制器在文件夹“控制器”中的所有其他控制器之前触发?我有一个项目,每个用户都有不同的网站语言,所以我想先检查设置,然后使用:

Yii::$app->language='en-EN';

现在我在我拥有的每个控制器中都这样做,但我想这应该是一个更简单的选择。

【问题讨论】:

  • 你检查了配置文件config/main.php吗?
  • 是的,恐怕我无法接触到那里的任何模型。尝试使用 Yii::$app->user->identity->user_lang; 时出现“尝试获取非对象的属性”错误

标签: php yii controller


【解决方案1】:

我之前也遇到过同样的问题,通过添加另一个组件找到了解决方案。

How to load class at every page load in advanced app

将配置中的类添加到组件部分并通过添加到引导程序在开始时加载它。

config.php

$config = [
    // ..
    'components' => [
        'InitRoutines' => [
            'class' => 'app\commands\InitRoutines', // my custom class
        ],
    ],
];

$config['bootstrap'][] = 'InitRoutines';

然后让你的类使用init() 方法扩展Component

InitRoutines.php

namespace app\commands;

use Yii;
use yii\base\Component;
use app\commands\AppHelper;
use app\commands\Access;

class InitRoutines extends Component
{
    // this method runs at start at every page load
    public function init()
    {
        parent::init();
        Access::checkForMaintenance(); // my custom method
        Yii::$app->language = AppHelper::getUserLanguageCode(); // my custom method
    }
}

【讨论】:

  • 太好了!谢谢。
【解决方案2】:

您可以附加到应用程序事件beforeActionbeforeRequest 并在此处执行您的操作。对我来说似乎更容易,例如:

$config = [
    // ..
    'on beforeRequest' => function($event) {
        Yii::$app->language='en-EN';           
    }
];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    相关资源
    最近更新 更多