laravel4的文件配置结构:
说明:上图中app.php文件再不同环境下都要重新定义,已经环境不同,需要的信息也不同。
这样做的好处:
- 配置结构清晰
- 方便版本管理
- 修改方便
坏处:
- 重复文件比较多
- 涉密信息公开化,不安全
laravel5的文件配置结构:
说明:laravel5 去掉了一个环境一个文件夹的配置模式,采用“.env”环境变量来管理不同环境下的信息,config目录中的文件调用.env的信息。也就是不同环境需要手动修改.env文件。
好处:
- 精简了配置文件数量
- .env不再版本控制中,信息安全
缺点:
- 线上信息修改更新很不方便,需要手动修改或覆盖
基于上边的因素,结合俩个版本的优点,改造配置文件结构,避免缺点,放大优点
上图是改造后的文件结构,config目录不发生变化,增减env目录,这里有不同的环境变量配置文件;.env文件只起到:定义当前环境,保存涉密信息
.env文件
APP_ENV=local
//local.env文件
#当前系统域名配置
APP_URL=http://www.domain.com
#调试模式开关配置
APP_DEBUG=true
#日志记录方式
APP_LOG=daily
#设置报错级别
APP_LOG_LEVEL=debug
//bootstrap目录下新建env.php文件
use Dotenv\Dotenv;
use Dotenv\Loader;
$_env_file = rtrim($app->environmentPath() , DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR. ".env";
$_env = array();
$fp = fopen($_env_file , "r");
if ($fp) {
while (($buffer = fgets($fp, 4096)) !== false) {
$buffer = trim($buffer);
$_buffer = explode("=", $buffer);
if (!$_buffer[0]){
continue;
}
$_env[$_buffer[0]] = trim($_buffer[1]);
}
if (!feof($fp)) {
die('[error] unexpected fgets() fail\n');
}
fclose($fp);
}
if (empty($_env['APP_ENV']) ) {
die('[error] no .env environment');
}
//从配置路径中加载指定配置文件
$app->loadEnvironmentFrom($_env['APP_ENV'] . '.env')
->useEnvironmentPath(base_path('env'));
$dot_env = new Dotenv($app->environmentPath(), $app->environmentFile());
$lines_env = $dot_env->load();
$filePath = rtrim($app->environmentPath() , DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR. $app->environmentFile();
//通过加载器设置环境参数 APP_ENV, APP_HOST
$dot_loader = new Loader($filePath, true);
foreach ($_env as $key => $value) {
//和.env文件中的配置比较,如果$lines_env有的直接忽略
if (array_key_exists($key, $lines_env) ){
continue;
}
$dot_loader->setEnvironmentVariable($key, $value);
}
//bootstrap目录下app.php文件添加下边内容
require_once __DIR__.'/env.php';
通过上边代码的改造部署,基本就可以使用了。未必是最完美的,主要看你怎么用了