應用設定

簡介

Laravel 框架的所有設定檔案都保存在 config 資料夾中。每個選項都有說明在上面,你可隨時查看這些檔案並熟悉有哪些設定選項可供使用

這些設定檔案允許你去設定一些比如你的資料庫連線資訊. 郵件伺服器資訊,乃至於各種核心設定值,比如時區或編碼等等

環境設定

對於應用運行的環境來說,能針對不同環境作不同的配置通常是很有用的。例如,你可能希望在本地使用的快取驅動不同於正式環境所使用的快取驅動,因為本地端只要能測試與開發即可,但在正式環境可能更多的是要求效能

Laravel 利用 Vance Lucas 的 PHP 庫 DotEnv 使得此項功能的實現變得非常簡單。在新安裝好的 Laravel 專案中,其根目錄會包含一個 .env.example 檔案,裏頭定義了很多的常見環境參數。在Laravel的安裝過程中,這個檔案會自動的複製一份來生成.env檔案

本地端和正式環境所用的參數設定往往不相同,因此也不太需要納入版本控管(考慮安全性也是一個原因)。這個參數之後會被各種位於 config 資料夾的 Laravel 設定檔案透過 env() 來加以取用

如果應用是整個團隊在開發,則可能希望專案中仍包含 .env.example 檔案。因為通過在範例設定文件中放置占位值,團隊中的其他開發人員可以清楚地看到哪些環境參數是運行應用所必需的

技巧:

.env 文件中的所有變量都可被外部環境變量(比如服務器級或系統級環境變量)所覆蓋。

你也可以創建一個 .env.testing 檔案,當運行 PHPUnit 測試或以 env=testing 為選項執行 Artisan 命令時,該檔案將覆蓋 .env 文件中的值。(這部分我還沒測試過,先作紀錄)

環境檔案安全性

你的 .env 文件不應該提交到應用的版本控管系統中(通常就是Git),因為每個使用你的應用的開發人員 / 服務器都可能需要有一個不同的環境設定,也就是意義不大。此外,在入侵者獲得你的版本控管倉庫的訪問權的情況下,這會成為一個安全問題,因為任何敏感的帳密都會被暴露在外人眼前

環境參數類型

因為 .env 文件里所有的參數值都會被解析成字串類型,所以可以使用 env() 幫助函式,函式裡創建了一些保留值,可提供更大範圍的參數類型:

.env值 env()值
(bool) true
(true) (bool) true
false (bool) false
(false) (bool) false
empty (string) ''
(empty) (string) ''
null (null) null
(null) (null) null

小技巧:

如果你需要使用包含空格的值來定義環境參數,可以通過將值包在雙引號裏頭來實現

APP_NAME="My Application"

取用環境參數

當應用收到請求時,此檔案中列出的所有參數都將被加載到 PHP $ENV 超級全局變數中。 但是,你可以使用 env() 這個幫助函式從設定檔案中的這些變數中去檢索值。 實際上,如果查看 Laravel 設定檔案,您會注意到很多設定當中都使用 env():

'debug' => env('APP_DEBUG', false),

傳遞給 env()的第二個參數是 「預設值」。 如果所提供的環境參數找不到對應的值,甚至不存在,則將使用此「預設值」

確認當前環境

當前的應用環境是通過 .env 文件中的 APP_ENV 參數確定的。比方說當在本地開發環境,我們設定 APP_ENV 參數為 local,而如果是正式環境則將之設為 production

你可以通過 App facade 的 environment() 來取用此值:

use Illuminate\Support\Facades\App;

$environment = App::environment();

反過來,你也可以將參數傳遞給 environment(),用來確認環境是否和你所傳送參數一致,如果環境與參數一致,則該方法將返回 true,可理解為當前執行環境與你的預期是相同的:

if (App::environment('local')) {
    // 該環境為本地端
}

if (App::environment(['local', 'staging'])) {
    // 該環境為本地或者是 staging...
}

(選修)超級技巧:

服務器級別的 APP_ENV 環境變數可以覆蓋當前的應用環境檢測。當你需要為不同的環境設定共享同一應用時,這很有用,因此你可以設定給定的主機以搭配服務器配定中的指定環境。(有點複雜,我沒有作過讓同一個.env對應多個專案的案子,不太明白,先作紀錄)

Accessing Configuration Values

你可以輕鬆地在應用的任何地方使用全局 config() 來取用設定值。設定值的取用可以搭配使用「點」語法,這其中包含了要取用的檔案和選項的名稱,此外還可以指定預設值,如果設定選項不存在,則返回預設值:

下面這個例子取用 config/app.php 設定檔裡頭的 timezone 選項的值

$value = config('app.timezone');

下面這個例子增加第二參數,當設定檔裏頭的 timezone選項的值不存在,就會傳回 Asia/Seoul

$value = config('app.timezone', 'Asia/Seoul');

如想要在運行時動態設定參數值,可以傳入一個陣列給 config() :

config(['app.timezone' => 'America/Chicago']);

環境設定的快取

為了提升應用的速度,你應該使用 Artisan 命令 config:cache 將所有的設定檔案快取到單一個檔案中。這會把你的應用中所有的設定選項合併成單一檔案,然後框架會快速加載這個檔案

通常來說,你應該把運行 php artisan config:cache(設定快取)命令作為正式環境的部署工作流程的一部分。另一方面,由於在應用開發過程中經常需要修改設定選項,所以不建議在本地開發環境下執行這指令,以免發生擾人的靈異現象,也就是參數怎麼改都沒有發生作用的狀況

注意:

如果在部署過程中執行 config:cache 命令,那麼你應該確保只從設定檔案內去呼叫 env() 。因為一旦設定被快取,.env 檔案將不會再被加載,導致所有對 env()的呼叫都將回傳 null

除錯模式

在 cofig/app.php 設定檔裡的 debug 選項決定當錯誤發生時要顯示多少的資訊讓使用者看到。預設這個選項會取用 .env 檔案裏頭環境參數 APP_DEBUG

如果是本地開發環境,你應該設定 APP_DEBUG 環境參數為 true,以方便你開發過程中的除錯處理。如果是在正式環境,這個參數永遠都應該是 false ,除非你能確保不被其他訪客看到。假如你在正式環境將此設定打開,那麼就需要冒將會把敏感的設定參數攤開在終端使用者面前的風險

(選讀)維護模式

當應用處於維護模式時,所有對應用的請求都會轉而顯示為一個自定義視圖。這讓你可以在更新或執行維護時輕鬆地「停用」你的應用。 應用對於維護模式的確認包含在應用的預設中介層中。如果應用處於維護模式,則將拋出一個狀態碼為 503 的 MaintenanceModeException 異常

要啟用維護模式,只需執行下面的 Artisan 的 down 命令:

php artisan down

你還可以向 down 命令提供 retry 選項。該選項 retry 值可用於設定 HTTP 請求標頭中 Retry-After 的值:

php artisan down --retry=60

即便在維護模式下,你也可以使用 secret 選項指定維護模式的通關口令:

php artisan down --secret="1630542a-246b-4b66-afa1-dd72a4c43515"

將應用設定成維護模式後,可以訪問該應用 URL 並連同通關口令,Laravel 將向您的瀏覽器發出一個維護模式通關 cookie:

https://example.com/1630542a-246b-4b66-afa1-dd72a4c43515

當訪問這個隱藏的路由時,你將被轉址到應用的根(/)路由。一旦 cookie 被傳輸到你的瀏覽器,你將能正常瀏覽應用,就如同它沒有處於維護模式一樣

預渲染維護模式視圖

如果在正式環境中使用 php artisan down 命令,當你的 Composer 依賴或其基礎組件更新時,你的用戶可能遇到偶然性的錯誤。這是因為 Laravel 框架的重要部分必須啟動才能確定應用處於維護模式,並使用模板引擎呈現維護模式的視圖畫面。

為解決這個問題,Laravel 允許你預先呈現一個維護模式視圖,該視圖將在請求周期的最開始就返回。此視圖在加載應用的任何依賴之前就會呈現。可以使用 down 命令的 render 選項來指定預渲染所選模板:

php artisan down --render="errors::503"

轉址維護模式請求

在維護模式下,Laravel 將顯示應用的維護模式視圖給嘗試訪問所有應用 URL 的用戶 。如果你想要的話,可以指示 Laravel 將所有請求轉址到特定的 URL。這可以使用 redirect 選項來完成。例如,希望將所有請求轉址到 / URI,可以這麼作

php artisan down --redirect=/

關閉維護模式

要關閉維護模式,請使用 up 命令:

php artisan up

小技巧:

你可以通過修改 resources/views/errors/503.blade.php 視圖文件來自定義預設維護模式視圖模板

維護模式與隊列

當應用程序處於維護模式時,不會處理隊列任務。你不需要擔心,這些任務將會在應用程序退出維護模式後再繼續處理

維護模式替代方案

維護模式會導致應用有數秒的停機(不回應)時間,如果你的應用一秒鐘價值幾十萬上下,可以考慮使用像 Envoyer 這樣的替代方案,以便與 Laravel 搭配完成零停機時間部署

Select a repo