环境变量配置的正确使用姿势

浏览:9732 发布日期:2016/08/05 分类:ThinkPHP5专区
tp5有一个比较隐晦的功能,就是环境变量,手册里只是寥寥几句话带过,本人就环境变量如何使用做了一番研究,总结出正确的使用姿势。

1.什么是环境变量
tp除了加载项目配置config.php,还会去加载一个可能存在的 env.php ,位于项目根目录下,也就是跟composer.json同级。

2.env.php格式
和配置文件一样,返回一个数组,例如:<?php
return [
        'app_debug' =>false
];
3. 优先级
当读取配置的时候,如 config('app_debug') ,tp5会先检查有没有对应的环境变量,如果有的话,就直接返回,否则才会去项目配置文件config.php中去找。

4.坑!坑!坑!
如果你仅限于上面的使用场景,那么是没问题的,但如果我想在env.php中设置数据库配置呢?
按一般逻辑,在env.php中这样定义return [
    'database' => [
         'username' => 'root',
        'password' => '1234565',
         //...
    ]
];
满心以为这样就能替代application/database.php了,然而,不行。

原因我就直接交代了,环境变量值不支持标量以外的类型,也就是说 'database' => '1234' '1234'是标量,而上面的是一个数组,数组不是标量,不支持!

所以,环境变量不能这么用,我个人觉得tp5在这一块的设计不是那么好,不应该在读取配置的时候去判断环境变量,而应该让用户决定是否在配置文件中使用环境变量。

以下是我的改进用法:

首先定义 env.php <?php
return [
    'database_username' => 'root',
    'database_database' => 'test',
    'database_prefix' => 'db_'
];
然后修改 application/database.php //..省略
    'database'       => getenv(ENV_PREFIX . strtoupper('database_database'))?:'',
    'username'       => getenv(ENV_PREFIX . strtoupper('database_username'))?:'root',
    'prefix'         => getenv(ENV_PREFIX . strtoupper('database_prefix'))?:'',
//..省略
这样就ok了

5. 最后一个提示
如果你仍然想用优先级覆盖机制,并且想覆盖某个二维数组,通过config('param1.param2') 这种形式读取配置,那么你的env.php要这样定义return [
    'param1_param2' => '12345'
];
没错,要把 . 换成 _



最佳答案
评论( 相关
后面还有条评论,点击查看>>