Yii2根据存储在DB

时间:2016-05-08 14:38:37

标签: php yii yii2 yii2-advanced-app

现在我正在尝试为基于Yii2的项目实现这些项目。 我现在怎么看:

  1. 用户从设置列表中选择应用程序主题 页面在后端。
  2. 使用yii2-settings我正在保存所有内容 DB中的配置数据(非常简单)。
  3. 在申请中 bootstrap.php我正在创建一个名为@theme的新别名。基本上它 应该引导我们到应用程序主题基础路径(用于搜索 路径,资产经理,e.t.c。)。
  4. 据官方透露 文档,这就是我配置视图组件的方式:

    'view' => [
        'theme' => [
            'basePath' => '@theme',
            'baseUrl' => '@theme',
            'pathMap' => [
                '@app/views' => '@theme',
                '@app/widgets' => '@theme/widgets',
                '@app/modules' => '@theme/modules',
            ],
        ],
    ],
    
  5. 我遇到的问题是第3页。根据{{​​3}}文档,我应该如何阅读设置:

    $theme = Yii::$app->settings->get('name', 'general');
    Yii::setAlias('@theme', realpath(dirname(__FILE__)."/../../themes/$theme"));
    

    但显然,它不适合我,因为yii2-settings组件在调用bootstrap.php时尚未初始化。我一直试图在我的基本控制器的init()方法中稍后初始化它,然后手动调整其他别名,但我觉得这样做有些“不干净”,而且它仍然失败,因为@theme别名也被使用在资产文件中,在调用控制器的init方法之前,Yii2开始发布。

    那么有没有人想过如何做到这一点'尽可能少地'破解'代码?我知道我可以将配置移动到某个文件,然后在应用程序初始化之前手动读取它,但它仍然不是我想要的方式。 也许有一些方法可以覆盖某些系统组件来在加载db组件之后但在查看组件配置之前设置别名?或者Yii以不同的顺序加载这些组件?无论如何。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

您可以在bootstrap中尝试Application Event

\Yii::$app->on(\yii\base\Application::EVENT_BEFORE_REQUEST, function ($event) {
    $theme = Yii::$app->settings->get('name', 'general');
    Yii::setAlias('@theme', realpath(dirname(__FILE__)."/../../themes/$theme"));
});

配置文件中的OR:

[
    'on beforeRequest' => function ($event) {
        // ...
    },
]

来自Yii 2 docs:

  

EVENT_BEFORE_REQUEST在应用程序之前触发此事件   处理请求。实际的事件名称是beforeRequest。

     

触发此事件时,应用程序实例已执行   已配置和初始化。所以这是一个插入你的好地方   自定义代码通过事件机制拦截请求处理   处理。例如,在事件处理程序中,您可以动态设置   yii \ base \ Application :: $ language属性基于一些参数。

答案 1 :(得分:-1)

这是最终的解决方案:

配置/ bootstrap.php中:

// Setting a temporary path for components configuration - will be changed later
Yii::setAlias('@theme', realpath(dirname(__FILE__)."/../../themes/"));

配置/ main.php

'components' => [
        'view' => [
            'theme' => [
                'basePath' => '@theme',
                'baseUrl' => '@theme',
                'pathMap' => [
                    '@app/views' => '@theme',
                    '@app/widgets' => '@theme/widgets',
                    '@app/modules' => '@theme/modules',
                ],
            ],
        ],
],
'on beforeRequest' => function ($event) {
        $theme = Yii::$app->settings->get('theme', 'general');
        Yii::setAlias('@theme', realpath(dirname(__FILE__)."/../../themes/$theme"));
},