我正在开发基于Yii2框架的多个网站,我想知道是否有任何好的方法,或者是否创建共享的基本配置main.php
文件甚至是好主意。
背后的原因是我的所有项目都基于相同的系统,有很多相似之处,我只想保持干燥。配置也大致相同 - 唯一的区别实际上是数据库名称和其他一些值。甚至urlManager规则也没有那么不同。
问题在于,例如,当我想为所有网站添加额外的FileTarget
到记录器目标时,我必须分别为每个项目执行此操作,我无法确定所有项目配置是否都是最新的并妥善安装一切。
所以我想知道是否有任何Yii方式创建在多个项目中共享的默认配置文件,或者它是否只是一个坏主意。例如,我可以创建bootstrap组件来设置默认值,或者将默认配置添加为frontend\web\index.php
文件中合并配置列表中的第一项。我在编辑器中添加了私有包,因此添加将在所有项目中共享的文件不是问题。
答案 0 :(得分:6)
我在相同的问题上工作了很长时间,并尝试了几个想法。
目前,我为您描述的问题开发了很好的解决方案。 解决方案的核心是hiqdev/composer-config-plugin - 作曲家插件,它将扩展中的配置合并。
例如,我们的扩展程序是我们所有网络项目hiqdev/hisite-core的基础,它包含基本的Yii应用程序config和params:
return [
'id' => 'hisite',
'name' => 'HiSite',
'aliases' => [
'@bower' => '@vendor/bower-asset',
...
这些配置在composer.json中启用了以下行:
"extra": {
"config-plugin": {
"params": "src/config/params.php",
"hisite": "src/config/hisite.php"
}
},
就是这样。你需要hiqdev / hisite-core并且在运行作曲家更新之后你已经在vendor / hiqdev / config / hisite.php中组装了配置(你可能有多个配置)
然后你在index.php中使用它,如下所示:
$config = require dirname(dirname(__DIR__)) . '/hiqdev/config/hisite.php';
您可以使用Yii扩展引导实现类似的行为,但是引导程序必须在每个页面请求上运行。
解决方案的优点在于,您可以拥有许多组件,每个组件都提供自己的配置部分,并且它可以在不减慢页面渲染时间的情况下工作,因为配置在composer安装/更新时合并了一次。 (并且你可以强制使用composer dump-autoload合并config,不要忘记在更改配置后运行它。)
使用这种技术我们创建了自动插件扩展:不需要在主配置中配置的主题,模块等等 - 你只需要在composer.json中使用它们就可以了。
此解决方案仍在进行中,并且它将继续发展和变化,但我们将其用于具有30多个扩展的非常大的基于Yii2的应用程序,并且已经过测试且足够稳定。
答案 1 :(得分:5)
作为一个更简单的替代方案,您可以将文件放在某处并将其包含在所有配置中,即
$commonConfig = require '/var/www/common/config.php';
$appConfig = require 'configs/main.php';
$config = array_merge($commonConfig, $appConfig);
// ...
答案 2 :(得分:0)
我最终做的是创建一个ConfigHelper
类,帮助将本地配置与全局配置相结合。我发帖只是为了让其他人看到这个想法。这可能不是最好的解决方案,但它适用于我现有的设置。
ConfigHelper
以及默认配置文件包含在我使用composer在所有基于yii2的项目中包含的其中一个包(私有存储库)中。
现在,而不是从yii2模板合并的默认fronted/web/index.php
配置:
$config = yii\helpers\ArrayHelper::merge(
require(__DIR__ . '/../../common/config/main.php'),
require(__DIR__ . '/../../common/config/main-local.php'),
require(__DIR__ . '/../config/main.php'),
require(__DIR__ . '/../config/main-local.php')
);
$application = new yii\web\Application($config);
$application->run();
我正在使用我的助手类:
$config = ConfigHelper::build(
__DIR__ . '/../..', //project root path
ConfigHelper::TIER_FRONTEND, // fronted, console or backend
'my-unique-app-name', //could be any other param that you need
);
$application = new yii\web\Application($config);
$application->run();
辅助类,它旁边的文件中也有默认配置:
class ConfigHelper
{
const TIER_FRONTEND = 'frontend';
const TIER_CONSOLE = 'console';
const TIER_BACKEND = 'backend';
public static function build($root, $tier, $website)
{
// Notice that local files are included so in case they don't exist there won't be errors
return ArrayHelper::merge(
require(__DIR__ . "/../config/common/main.php"), // global basic config file for all projects
require("{$root}/common/config/main.php"),
include("{$root}/common/config/main-local.php"),
require(__DIR__ . "/../config/{$tier}/main.php"), // global basic config file for all projects
require("{$root}/{$tier}/config/main.php"),
include("{$root}/{$tier}/config/main-local.php")
);
}
}
全局默认配置文件与Yii2中使用的相同。它们只包含常用设置,不包括您可以像往常一样为每个应用添加的唯一设置。