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/databa原因我就直接交代了,环境变量值不支持标量以外的类型,也就是说
'database' => '1234' '1234'是标量,而上面的是一个数组,数组不是标量,不支持!所以,环境变量不能这么用,我个人觉得tp5在这一块的设计不是那么好,不应该在读取配置的时候去判断环境变量,而应该让用户决定是否在配置文件中使用环境变量。
以下是我的改进用法:
首先定义 env.php
<?php
return [
'database_username' => 'root',
'database_database' => 'test',
'database_prefix' => 'db_'
];然后修改 application/databa//..省略
'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'
];没错,要把 . 换成 _ 最佳答案