Yii2中所有项目的默认main.php配置文件

lab*_*key 6 yii2 yii2-advanced-app

我正在开发基于Yii2框架的多个网站,我想知道是否有任何好方法或者是否创建共享基本配置main.php文件甚至是好主意.

这背后的原因是我的所有项目都基于相同的系统,有很多相似之处,我只想保持干燥.配置也大致相同 - 唯一的区别实际上是数据库名称和其他一些值.甚至urlManager规则也没有那么不同.

问题是,例如,当我想FileTarget为所有网站添加额外的记录器目标时,我必须分别为每个项目执行此操作,我永远无法确定所有项目配置是否都是最新的并且所有设置都正确.

所以我想知道是否有任何Yii方式创建在多个项目中共享的默认配置文件,或者它只是一个坏主意.例如,我可以创建bootstrap组件来设置默认值,或者将默认配置添加为文件中合并配置列表中的第一项frontend\web\index.php.我在作曲家中添加了私有包,因此添加将在所有项目中共享的文件不是问题.

小智 6

我在很长一段时间内都在研究同一个问题,并尝试了几个想法.

目前,我为您描述的问题开​​发了很好的解决方案.解决方案的核心是hiqdev/composer-config-plugin - composer插件,它融合了扩展中的配置.

例如,我们的扩展是我们所有web项目的基础hiqdev/hisite-core它包含基本的Yii应用程序配置参数:

return [
    'id' => 'hisite',
    'name' => 'HiSite',
    'aliases' => [
        '@bower' => '@vendor/bower-asset',
        ...
Run Code Online (Sandbox Code Playgroud)

这些配置在composer.json中使用以下行启用:

"extra": {
    "config-plugin": {
        "params": "src/config/params.php",
        "hisite": "src/config/hisite.php"
    }
},
Run Code Online (Sandbox Code Playgroud)

就是这样.你需要hiqdev/hisite-core并且在运行composer update之后你在vendor/hiqdev/config/hisite.php中组装了配置(你可能有多个配置)

然后你从index.php中使用它,如下所示:

$config = require dirname(dirname(__DIR__)) . '/hiqdev/config/hisite.php';
Run Code Online (Sandbox Code Playgroud)

您可以使用Yii扩展引导实现类似的行为,但是引导程序必须在每个页面请求上运行.

该解决方案的优点在于,您可以拥有许多组件,每个组件都提供自己的配置部分,并且它可以在不减慢页面渲染时间的情况下工作,因为配置在composer安装/更新时合并一次.(并且你可以强制使用composer dump-autoload合并配置,不要忘记在更改配置后运行它).

使用这种技术,我们创建了自动插件扩展:主题,模块和更多不需要在主配置中配置的 - 你只需要在composer.json中使用它们就可以了.

这个解决方案仍在进行中,它将不断发展和变化,但我们将它用于具有30多个扩展的非常大的基于Yii2的应用程序,并且已经过测试且足够稳定.


Sam*_*ark 5

作为一个更简单的替代方案,您可以将文件放在某处并将其包含在所有配置中,即

$commonConfig = require '/var/www/common/config.php';
$appConfig = require 'configs/main.php';
$config = array_merge($commonConfig, $appConfig);
// ...
Run Code Online (Sandbox Code Playgroud)