laravel5已經設計了環境管理功能:
使用HTTP時只需要在apache或nginx中添加APP_ENV=環境名 即可(當然比較麻煩,每個服務器環境都需要配置),如果使用artisan 命令行方式只需要在命令中追加參數 --env=環境名 即可。但並未做到不同環境取不同配置的功能,需要額外增加代碼即可。
在HTTP方式中,如果對每個服務器添加 環境變量 雖然可行,可給域名留下隨意配置的藉口,給後續通過域名就能區分環境留下不便,在這裏推薦一個辦法,使用域名的後綴來定義環境,極大的方便域名區分環境,同時也不需要在服務器中配置 環境變量,給搭建環境提供方便。
使用域名進行區分環境的好處是不同的域名可以直觀看出這是哪個環境。
以域名 www.laravel.com 爲例:
各環境域名要求如下:
本地環境: www.laravel.loc
開發合成環境:www.laravel.dev
測試環境: www.laravel.test
預發環境:www.laravel.pre
正式生產環境:www.laravel.com
其中開發環境,測試環境勻可以在公共路由配置hosts,方便大家使用。
增加代碼:
在 bootstrap/目錄下增加文件 env.php 並增加代碼:
<?php //域名配置 $env_hosts = [ 'local' => ['www.laravel.loc'], 'develop' => ['www.laravel.dev'], 'test' => ['www.laravel.test'], 'production' => ['www.laravel.com'], ]; //環境處理 if (!$app->runningInConsole()) {//HTTP形式 if (empty($_SERVER['HTTP_HOST'])) { die('[error] no host'); } foreach ($env_hosts as $env => $hosts) { if (in_array($_SERVER['HTTP_HOST'], $hosts)) { $app_env = $env; break; } } } else {//其它形式 $app_env = $app->detectEnvironment(function () { return 'production'; }); } if (empty($app_env) || empty($env_hosts[$app_env])) { die('[error] no environment'); } //寫入環境配置 Dotenv::setEnvironmentVariable('APP_ENV', $app_env); Dotenv::setEnvironmentVariable('APP_HOST', $env_hosts[$app_env][0]); $app->loadEnvironmentFrom(env('APP_ENV') . '.env') ->useEnvironmentPath(base_path('env'));
在bootstrap/app.php文件中增加一行:(注意位置,一定要在Illuminate\Foundation\Application實例化之後)
require_once __DIR__.'/env.php';
如下:
在框架的根目錄創建 env 目錄並添加如下幾個文件:內容可以直接複製 .env 文件
local.env
develop.env
testing.env
pretest.env
production.env
現在可以在任意controller中測試環境變量是否OK:
在不同的環境文件中修改配置: APP_KEY 的值。
var_dump(app()['env'],env('APP_KEY'));die;
注意:使用這種方式配置環境需要額外增加幾個環境配置文件,當有一個在變動時,其它的幾個就有可能需要跟着變動,如果幾個環境中完全不會變的配置,就無需添加到環境配置中,使用這種方式配置的環境。
在調用 artisan 命令時如果命令中執行代碼有涉及到環境,那麼都需要添加上環境參數,如:
php artisan queue:listen --env=production
否則命令行會引用錯誤環境配置,導致程序異常。
注意:laravel5各個小版本包括 lumen 會有些差異主要是 Dotenv::setEnvironmentVariable 方式有兩種版本:
靜態方式調用版:(laravel 5.0 , laravel 5.1)
Dotenv::setEnvironmentVariable('APP_ENV', $app_env);
實例化方式調用版:(laravel 5.2 , lumen)
$load =new Dotenv\Loader(''); $load->setEnvironmentVariable('APP_ENV', $app_env);
使用時注意當前版本。