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

时间:2016-08-25 12:21:00

标签: yii2 yii2-advanced-app

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

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

问题在于,例如,当我想为所有网站添加额外的FileTarget到记录器目标时,我必须分别为每个项目执行此操作,我无法确定所有项目配置是否都是最新的并妥善安装一切。

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

3 个答案:

答案 0 :(得分:6)

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

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

例如,我们的扩展程序是我们所有网络项目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并且在运行作曲家更新之后你已经在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中使用的相同。它们只包含常用设置,不包括您可以像往常一样为每个应用添加的唯一设置。