laravel5下多環境.env配置

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';


以下:

wKioL1i1AgWRtwH0AAHf2ajh4CA603.jpg



在框架的根目錄建立 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);


使用時注意當前版本。

相關文章
相關標籤/搜索