使用多个配置来简化部署

高级应用模板为它的每一个应用使用不同的配置文件。

  1. common
  2. config
  3. main.php
  4. main-local.php
  5. params.php
  6. params-local.php
  7. console
  8. config
  9. main.php
  10. main-local.php
  11. params.php
  12. params-local.php
  13. backend
  14. config
  15. main.php
  16. main-local.php
  17. params.php
  18. params-local.php
  19. frontend
  20. config
  21. main.php
  22. main-local.php
  23. params.php
  24. params-local.php

每一个入口web/index.php脚本合并自己配置文件的集合:

  1. $config = yii\helpers\ArrayHelper::merge(
  2. require(__DIR__ . '/../../common/config/main.php'),
  3. require(__DIR__ . '/../../common/config/main-local.php'),
  4. require(__DIR__ . '/../config/main.php'),
  5. require(__DIR__ . '/../config/main-local.php')
  6. );
  7. $application = new yii\web\Application($config);
  8. $application->run();

每一个config/main.php文件和并参数:

  1. <?php
  2. $params = array_merge(
  3. require(__DIR__ . '/../../common/config/params.php'),
  4. require(__DIR__ . '/../../common/config/params-local.php'),
  5. require(__DIR__ . '/params.php'),
  6. require(__DIR__ . '/params-local.php')
  7. );
  8. return [
  9. // ...
  10. 'params' => $params,
  11. ];

这个系统允许你配置应用中常用和特殊应用属性和组件。并且我们可以基于版本控制系统,存储缺省配置文件,并忽略所有的*-local.php文件。

所有的本地文件模板在environments文件夹中准备,当你在控制台中运行php init,并选择一个needle环境,这个初始脚本复制相应的文件,并将它们放在目标文件夹中。

但是基础应用模板不包含敏捷配置系统,只提供如下文件:

  1. config
  2. console.php
  3. web.php
  4. db.php
  5. params.php

尝试添加一个高级配置系统到yii2-app-basic应用模板中。

准备

按照官方指南http://www.yiiframework.com/doc-2.0/guide-start-installation.html的描述,使用Composer包管理器创建一个新的yii2-app-basic应用。

如何做…

  1. 创建config/common.php文件:
  1. <?php
  2. $params = array_merge(
  3. require(__DIR__ . '/params.php'),
  4. require(__DIR__ . '/params-local.php')
  5. );
  6. return [
  7. 'basePath' => dirname(__DIR__),
  8. 'components' => [
  9. 'cache' => [
  10. 'class' => 'yii\caching\FileCache',
  11. ],
  12. 'mailer' => [
  13. 'class' => 'yii\swiftmailer\Mailer',
  14. ],
  15. 'db' => [],
  16. ],
  17. 'params' => $params,
  18. ];
  1. 创建config/common-local文件:
  1. <?php
  2. return [
  3. 'components' => [
  4. 'db' => [
  5. 'class' => 'yii\db\Connection',
  6. 'dsn' => 'mysql:host=localhost;dbname=yii2basic',
  7. 'username' => 'root',
  8. 'password' => '',
  9. 'charset' => 'utf8',
  10. ],
  11. 'mailer' => [
  12. 'useFileTransport' => true,
  13. ],
  14. ],
  15. ];
  1. 移除config/db.php文件:
  2. config/console.php移除重复的代码:
  1. <?php
  2. Yii::setAlias('@tests', dirname(__DIR__) . '/tests');
  3. return [
  4. 'id' => 'basic-console',
  5. 'bootstrap' => ['log', 'gii'],
  6. 'controllerNamespace' => 'app\commands',
  7. 'modules' => [
  8. 'gii' => 'yii\gii\Module',
  9. ],
  10. 'components' => [
  11. 'log' => [
  12. 'targets' => [
  13. [
  14. 'class' => 'yii\log\FileTarget',
  15. 'levels' => ['error', 'warning'],
  16. ],
  17. ],
  18. ],
  19. ],
  20. ];
  1. 创建一个带有空数组的文件config/console-local.php
  1. <?php return [];
  1. 修改config/web.php文件:
  1. $config = [
  2. 'id' => 'basic',
  3. 'bootstrap' => ['log'],
  4. 'components' => [
  5. 'user' => [
  6. 'identityClass' => 'app\models\User',
  7. 'enableAutoLogin' => true,
  8. ],
  9. 'errorHandler' => [
  10. 'errorAction' => 'site/error',
  11. ],
  12. 'log' => [
  13. 'traceLevel' => YII_DEBUG ? 3 : 0,
  14. 'targets' => [
  15. [
  16. 'class' => 'yii\log\FileTarget',
  17. 'levels' => ['error', 'warning'],
  18. ],
  19. ],
  20. ],
  21. ],
  22. ];
  23. if (YII_ENV_DEV) {
  24. // configuration adjustments for 'dev' environment
  25. $config['bootstrap'][] = 'debug';
  26. $config['modules']['debug'] = 'yii\debug\Module';
  27. $config['bootstrap'][] = 'gii';
  28. $config['modules']['gii'] = 'yii\gii\Module';
  29. }
  30. return $config;
  1. request配置移动到config/web-local.php文件中:
  1. <?php
  2. return [
  3. 'components' => [
  4. 'request' => [
  5. 'cookieValidationKey' => 'TRk9G1La5kvLFwqMEQTp6PmC1NHdjtkq',
  6. ],
  7. ],
  8. ];
  1. config/params.php文件中移除电子邮件ID:
  1. <?php
  2. return [
  3. 'adminEmail' => '',
  4. ];
  1. 粘贴ID到config/params-local.php文件:
  1. <?php
  2. return [
  3. 'adminEmail' => 'admin@example.com',
  4. ];
  1. tests/codeception/config/config.php移除dsn字符串:
  1. <?php
  2. /**
  3. * Application configuration shared by all test types
  4. */
  5. return [
  6. 'controllerMap' => [
  7. // ...
  8. ],
  9. 'components' => [
  10. 'db' => [
  11. 'dsn' => '',
  12. ],
  13. 'mailer' => [
  14. 'useFileTransport' => true,
  15. ],
  16. 'urlManager' => [
  17. 'showScriptName' => true,
  18. ],
  19. ],
  20. ];
  1. 将字符串放到一个新文件中tests/codeception/config/config-local.php
  1. <?php
  2. return [
  3. 'components' => [
  4. 'db' => [
  5. 'dsn' => 'mysql:host=localhost;dbname=yii2_basic_tests',
  6. ],
  7. ],
  8. ];
  1. 在文件web/index.php中添加配置合并:
  1. $config = yii\helpers\ArrayHelper::merge(
  2. require(__DIR__ . '/../config/common.php'),
  3. require(__DIR__ . '/../config/common-local.php'),
  4. require(__DIR__ . '/../config/web.php'),
  5. require(__DIR__ . '/../config/web-local.php')
  6. );
  1. 添加配置合并到终端入口脚本,yii
  1. $config = yii\helpers\ArrayHelper::merge(
  2. require(__DIR__ . '/config/common.php'),
  3. require(__DIR__ . '/config/common-local.php'),
  4. require(__DIR__ . '/config/console.php'),
  5. require(__DIR__ . '/config/console-local.php')
  6. );
  1. 添加配置合并到tests/codeception/config中含有单元、功能、验收测试的测试配置中:
  1. return yii\helpers\ArrayHelper::merge(
  2. require(__DIR__ . '/../../../config/common.php'),
  3. require(__DIR__ . '/../../../config/common-local.php'),
  4. require(__DIR__ . '/../../../config/web.php'),
  5. require(__DIR__ . '/../../../config/web-local.php'),
  6. require(__DIR__ . '/config.php'),
  7. require(__DIR__ . '/config-local.php'),
  8. [
  9. // ...
  10. ]
  11. );
  1. 添加配置合并到测试环境控制台的入口脚本,tests/codeception/bin/yii
  1. $config = yii\helpers\ArrayHelper::merge(
  2. require(YII_APP_BASE_PATH . '/config/common.php'),
  3. require(YII_APP_BASE_PATH . '/config/common-local.php'),
  4. require(YII_APP_BASE_PATH . '/config/console.php'),
  5. require(YII_APP_BASE_PATH . '/config/console-local.php'),
  6. require(__DIR__ . '/../config/config.php'),
  7. require(__DIR__ . '/../config/config-local.php')
  8. );
  1. 结果是,你可以在你的配置文件夹下,获得如下内容:
  1. config
  2. common.php
  3. common-local.php
  4. console.php
  5. console-local.php
  6. web.php
  7. web-local.php
  8. params.php
  9. params-local.php
  1. 最终,你可以添加一个新的.gitignore文件到你的configtests/codeception/config文件夹下,所以你可以通过版本控制系统忽略本地配置文件:
  1. /*-local.php

工作原理…

你可以在config/common.php文件中存储常见的应用组件配置,同时也可以为web和控制台应用设置指定的配置。你可以将你的临时和安全配置数据放在*-local.php文件中。

此外,你可以从yii2-app-advanced中复制初始化shell脚本。

  1. 创建一个新的environments目录,并复制你的模板到里边:
  1. environments
  2. dev
  3. config
  4. common-local.php
  5. console-local.php
  6. web-local.php
  7. params-local.php
  8. web
  9. index.php
  10. index-test.php
  11. tests
  12. codeception
  13. config
  14. config.php
  15. config-local.php
  16. yii
  17. prod
  18. config
  19. common-local.php
  20. console-local.php
  21. web-local.php
  22. params-local.php
  23. web
  24. index.php
  25. yii
  1. 创建environments/index.php文件:
  1. <?php
  2. return [
  3. 'Development' => [
  4. 'path' => 'dev',
  5. 'setWritable' => [
  6. 'runtime',
  7. 'web/assets',
  8. ],
  9. 'setExecutable' => [
  10. 'yii',
  11. 'tests/codeception/bin/yii',
  12. ],
  13. 'setCookieValidationKey' => [
  14. 'config/web-local.php',
  15. ],
  16. ],
  17. 'Production' => [
  18. 'path' => 'prod',
  19. 'setWritable' => [
  20. 'runtime',
  21. 'web/assets',
  22. ],
  23. 'setExecutable' => [
  24. 'yii',
  25. ],
  26. 'setCookieValidationKey' => [
  27. 'config/web-local.php',
  28. ],
  29. ],
  30. ];
  1. 从你的composer.json中移除默认的Installer::postCreateProject配置:
  1. "extra": {
  2. "asset-installer-paths": {
  3. "npm-asset-library": "vendor/npm",
  4. "bower-asset-library": "vendor/bower"
  5. }
  6. }
  1. 从高级模板https://github.com/yiisoft/yii2-app-advanced拷贝initinit.bat脚本,你可以使用php init运行初始化过程,从repository中克隆项目。

参考

欲了解更多关于应用配置的信息,参考http://www.yiiframework.com/doc-2.0/guide-concept-configurations.html