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

Default main.php config file for all projects in Yii2

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

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

问题是,例如,当我想向所有网站的记录器目标添加额外的 FileTarget 时,我必须分别为每个项目执行此操作,而且我永远无法确定是否所有项目配置都已启动到目前为止并正确设置所有内容。

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

我在同一个问题上工作了很长时间并尝试了几个想法。

目前我已经为您描述的问题开​​发了很好的解决方案。 解决方案的核心是 hiqdev/composer-config-plugin - 合并来自扩展的配置的作曲家插件。

例如,我们有一个扩展,它是我们所有网络项目的基础 hiqdev/hisite-core it contains basic Yii application config and 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 并且在 运行ning 作曲家更新之后您已经在 vendor/hiqdev/config/hisite.php

中组装了配置(您可能有多个配置)

然后您可以像这样从 index.php 使用它:

$config = require dirname(dirname(__DIR__)) . '/hiqdev/config/hisite.php';

您可以使用 Yii 扩展 bootstrapping 实现类似的行为,但 bootstrap 必须 运行 对每个页面请求。

解决方案的美妙之处在于您可以拥有许多组件,每个组件都提供自己的部分配置,并且它可以在不减慢页面渲染时间的情况下工作,因为配置在 composer install/update 上合并一次。 (并且您可以强制将配置与 composer dump-autoload 合并,不要忘记在更改配置后 运行 它)。

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

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

作为一种更简单的替代方法,您可以将文件放在某个地方并从所有配置中包含它,即

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

我最终做的是创建一个 ConfigHelper class 来帮助将本地配置与全局配置合并。我发布它只是为了让其他人看到这个想法。这可能不是最终的解决方案,但它适用于我现有的设置。

ConfigHelper 连同默认配置文件包含在我使用 composer 包含在我所有基于 yii2 的项目中的包(私有存储库)之一中。

现在不是默认的 fronted/web/index.php 配置从 yii2 模板合并:

$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();

我正在使用我的帮手class:

$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 旁边的文件中也有默认配置:

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中使用的相同。它们仅包含常用设置,不包括您可以像往常一样为每个应用添加的独特设置。