现在我正在尝试为基于Yii2的项目实现这些项目。 我现在怎么看:
据官方透露 文档,这就是我配置视图组件的方式:
'view' => [
'theme' => [
'basePath' => '@theme',
'baseUrl' => '@theme',
'pathMap' => [
'@app/views' => '@theme',
'@app/widgets' => '@theme/widgets',
'@app/modules' => '@theme/modules',
],
],
],
我遇到的问题是第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以不同的顺序加载这些组件?无论如何。任何帮助将不胜感激!
答案 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"));
},