yii2-env

在Yii的高级模版应用中,引入了环境的概念。

环境就是指开发环境、测试环境、产品环境等。 对于Yii而言,所谓的环境,就是一组与运行环境相关的配置文件和入口脚本。

Yii对于环境的使用是这样一个原理:采用一个自动化的脚本,每次需要切换环境时,就运行脚本, 由开发者确定要采用何种环境,然后将对应环境的所有配置文件都覆盖当前的配置文件。 在Yii中,与环境相关的文件其实就只有两个:一个是入口脚本 index.php 另一个就是各类配置文件。

在切换环境时,只需要一行命令就全部搞定:

php /path/to/project/init

这行命令会提示你选择何种开发环境,并确认是否覆盖当前的配置文件。下面是输出的内容:

Yii Application Initialization Tool v1.0

Which environment do you want the application to be initialized in?

  [0] Development
  [1] Production

  Your choice [0-1, or "q" to quit] 0    // 这里选择了 Development 环境

  Initialize the application under 'Development' environment? [yes|no] yes

  Start initialization ...

   generate yii
   generate common/config/main-local.php
   generate common/config/params-local.php
   generate backend/config/main-local.php
   generate backend/config/params-local.php
   generate backend/web/index.php
   generate backend/web/index-test.php
   generate frontend/config/main-local.php
   generate frontend/config/params-local.php
   generate frontend/web/index.php
   generate frontend/web/index-test.php
   generate console/config/main-local.php
   generate console/config/params-local.php
   generate cookie validation key in backend/config/main-local.php
   generate cookie validation key in frontend/config/main-local.php
      chmod 0777 backend/runtime
      chmod 0777 backend/web/assets
      chmod 0777 frontend/runtime
      chmod 0777 frontend/web/assets
      chmod 0755 yii

  ... initialization completed.

从上面的输出可以看出来, init 脚本其实做了3件事:

  1. 复制文件到相应位置,覆盖当前配置。
  2. 生成 cookieValidationKey 并写入相应文件。
  3. 设置相关文件和目录的权限。

环境的正确使用方法

例如记录日志,在开发环境我们需要将日志记录到文件中,而在生产环境,我们需要将日志记录到 sentry 并忽略 404 错误。

return [  
    'components' => [
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                ],
            ],
        ],
    ],
];

开发环境可以将上述内容加入 environments/dev/common/config/main-local.php 中。

return [  
    'components' => [
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
                [
                    'class' => 'notamedia\sentry\SentryTarget',
                    'dsn' => 'http://2682ybvhbs347:235vvgy465346@sentry.io/1',
                    'levels' => ['error', 'warning'],
                    'except' => ['yii\web\HttpException:404'],
                ],
            ],
        ],
    ],
];

生产环境可以将上述内容加入 environments/prod/common/config/main-local.php 中。

在开发服务器中通过 php init 选择开发环境,而在生产服务器中通过 php init 选择生产环境。

这样就会对应的文件覆盖common/config/main-local.php

可以参考 http://haobing.wang/yii2-log

代码中使用环境变量

<?= Html::jsFile(YII_DEBUG ? '@web/js/all.js' : '@web/js/all.min.js?v=' . filemtime(Yii::getAlias('@webroot/js/all.min.js'))) ?>