laravel5已經設計了環境管理功能:php
使用HTTP時只須要在apache或nginx中添加APP_ENV=環境名 便可(固然比較麻煩,每一個服務器環境都須要配置),若是使用artisan 命令行方式只須要在命令中追加參數 --env=環境名 便可。但並未作到不一樣環境取不一樣配置的功能,須要額外增長代碼便可。nginx
在HTTP方式中,若是對每一個服務器添加 環境變量 雖然可行,可給域名留下隨意配置的藉口,給後續經過域名就能區分環境留下不便,在這裏推薦一個辦法,使用域名的後綴來定義環境,極大的方便域名區分環境,同時也不須要在服務器中配置 環境變量,給搭建環境提供方便。laravel
使用域名進行區分環境的好處是不一樣的域名能夠直觀看出這是哪一個環境。
apache
以域名 www.laravel.com 爲例:bootstrap
各環境域名要求以下:
bash
本地環境: www.laravel.loc
服務器
開發合成環境:www.laravel.dev
app
測試環境: www.laravel.test
框架
預發環境:www.laravel.pre
ide
正式生產環境: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);
使用時注意當前版本。