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

问题描述 投票:0回答:3

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

main.php
文件是否是个好主意。

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

问题是,例如,当我想向所有网站的记录器目标添加额外的

FileTarget
时,我必须分别为每个项目执行此操作,并且我永远无法确定所有项目配置是否都是最新的并且是否已设置好所有内容正确地起来。

所以我想知道是否有任何 Yii 方法可以创建在多个项目中共享的默认配置文件,或者这只是一个坏主意。例如,我可以创建引导组件,该组件设置默认值或将默认配置添加为

frontend\web\index.php
文件中合并配置列表中的第一项。我在作曲家中添加了私有包,因此添加将在所有项目中共享的文件不是问题。

php yii2 yii2-advanced-app
3个回答
6
投票

我在同一问题上研究了相当长的时间,并尝试了几种想法。

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

例如,我们有一个扩展,它是我们所有 Web 项目的基础 hiqdev/hisite-core 它包含基本的 Yii 应用程序 configparams:

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,并且在运行 Composer update 后,您已在vendor/hiqdev/config/hisite.php 中组装了配置(您可能有多个配置)

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

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

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

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

使用这种技术,我们创建了自动插入扩展:主题、模块等不需要在主配置中配置 - 您只需在composer.json中需要它们即可工作。

该解决方案仍在开发中,并且将会不断发展和变化,但我们将其用于基于 Yii2 的大型应用程序,具有 30 多个扩展,并且它已经经过测试且足够稳定。


5
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.