設定
簡介
所有 Laravel 框架的設定檔都儲存在 config
目錄中。每個選項都有文件記載,因此請隨意瀏覽這些檔案,熟悉可用的選項。
這些設定檔讓您能夠設定資料庫連線資訊、郵件伺服器資訊,以及其他各種核心設定值,例如應用程式 URL 和加密金鑰。
about
命令
Laravel 可以透過 about
Artisan 命令,顯示應用程式的設定、驅動程式和環境概觀。
php artisan about
如果您只對應用程式概觀輸出的特定部分感興趣,可以使用 --only
選項來篩選該部分:
php artisan about --only=environment
或者,若要詳細探索特定設定檔的值,可以使用 config:show
Artisan 命令:
php artisan config:show database
環境設定
應用程式在不同環境中執行時,通常會需要不同的設定值。舉例來說,您可能會希望在本機使用與正式伺服器不同的快取驅動程式。
為了簡化此過程,Laravel 利用了 DotEnv PHP 函式庫。在全新的 Laravel 安裝中,您的應用程式根目錄會包含一個 .env.example
檔案,其中定義了許多常見的環境變數。在 Laravel 安裝過程中,此檔案將會自動複製為 .env
。
Laravel 預設的 .env
檔案包含一些常見的設定值,這些值可能會因您的應用程式是在本機執行還是正式網站伺服器上執行而有所不同。這些值隨後會透過 Laravel 的 env
函式,由 config
目錄中的設定檔讀取。
如果您是與團隊一同開發,您可能會希望繼續將 .env.example
檔案納入應用程式中並進行更新。透過在範例設定檔中放置預留位置值,團隊中的其他開發人員可以清楚地看到執行您的應用程式所需哪些環境變數。
📌 備註
您 .env
檔案中的任何變數都可以被外部環境變數覆寫,例如伺服器層級或系統層級的環境變數。
環境檔案安全性
您的 .env
檔案不應提交至應用程式的原始碼控制,因為使用您應用程式的每個開發人員/伺服器可能需要不同的環境設定。此外,如果入侵者取得您原始碼控制儲存庫的存取權,這將構成安全風險,因為任何敏感憑證都將會暴露。
然而,您可以使用 Laravel 內建的環境加密來加密您的環境檔案。加密的環境檔案可以安全地放置在原始碼控制中。
額外的環境檔案
在載入應用程式的環境變數之前,Laravel 會判斷是否有外部提供的 APP_ENV
環境變數,或是否已指定 --env
CLI 引數。如果存在,Laravel 將嘗試載入 .env.[APP_ENV]
檔案。如果該檔案不存在,則會載入預設的 .env
檔案。
環境變數類型
您 .env
檔案中的所有變數通常都會被解析為字串,因此已建立一些保留值,讓您能夠從 env()
函式回傳更廣泛的類型:
.env 值 | env() 值 |
---|---|
true | (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"
取得環境設定
當您的應用程式收到請求時,.env
檔案中列出的所有變數都將載入到 $_ENV
PHP 超級全域變數中。然而,您可以在設定檔中使用 env
函式來擷取這些變數的值。事實上,如果您查閱 Laravel 的設定檔,您會注意到許多選項都已經在使用此函式:
'debug' => env('APP_DEBUG', false),
傳遞給 env
函式的第二個值是「預設值」。如果指定鍵沒有環境變數存在,則會回傳此值。
判斷目前環境
目前的應用程式環境是透過您 .env
檔案中的 APP_ENV
變數來判斷的。您可以透過 App
facade 上的 environment
方法來存取此值:
use Illuminate\Support\Facades\App;
$environment = App::environment();
您也可以將引數傳遞給 environment
方法,以判斷環境是否與給定值相符。如果環境與任何給定值相符,該方法將回傳 true
:
if (App::environment('local')) {
// The environment is local
}
if (App::environment(['local', 'staging'])) {
// The environment is either local OR staging...
}
📌 備註
您可以透過定義伺服器層級的 APP_ENV
環境變數來覆寫目前的應用程式環境偵測。
加密環境檔案
未加密的環境檔案絕不應儲存在原始碼控制中。然而,Laravel 允許您加密您的環境檔案,以便它們可以安全地與應用程式的其他部分一同加入原始碼控制。
加密
若要加密環境檔案,您可以使用 env:encrypt
命令:
php artisan env:encrypt
執行 env:encrypt
命令將會加密您的 .env
檔案,並將加密內容放置在 .env.encrypted
檔案中。解密金鑰會顯示在命令的輸出中,並且應該儲存在安全的密碼管理器中。如果您想提供自己的加密金鑰,可以在呼叫命令時使用 --key
選項:
php artisan env:encrypt --key=3UVsEgGVK36XN82KKeyLFMhvosbZN1aF
📌 備註
所提供的金鑰長度應與所使用的加密演算法所需的金鑰長度相符。預設情況下,Laravel 將使用 AES-256-CBC
加密演算法,該演算法需要 32 個字元的金鑰。您可以透過在呼叫命令時傳遞 --cipher
選項來自由使用 Laravel 加密器支援的任何加密演算法。
如果您的應用程式有多個環境檔案,例如 .env
和 .env.staging
,您可以透過 --env
選項提供環境名稱來指定應加密的環境檔案:
php artisan env:encrypt --env=staging
解密
若要解密環境檔案,您可以使用 env:decrypt
命令。此命令需要一個解密金鑰,Laravel 將從 LARAVEL_ENV_ENCRYPTION_KEY
環境變數中擷取此金鑰:
php artisan env:decrypt
或者,金鑰也可以透過 --key
選項直接提供給命令:
php artisan env:decrypt --key=3UVsEgGVK36XN82KKeyLFMhvosbZN1aF
呼叫 env:decrypt
命令時,Laravel 將解密 .env.encrypted
檔案的內容,並將解密後的內容放置在 .env
檔案中。
可以將 --cipher
選項提供給 env:decrypt
命令,以便使用自訂加密演算法:
php artisan env:decrypt --key=qUWuNRdfuImXcKxZ --cipher=AES-128-CBC
如果您的應用程式有多個環境檔案,例如 .env
和 .env.staging
,您可以透過 --env
選項提供環境名稱來指定應解密的環境檔案:
php artisan env:decrypt --env=staging
為了覆寫現有的環境檔案,您可以將 --force
選項提供給 env:decrypt
命令:
php artisan env:decrypt --force
存取設定值
您可以使用 Config
Facade 或全域的 config
函式,在應用程式的任何地方輕鬆存取設定值。設定值可以使用「點」語法來存取,其中包括您希望存取的檔案名稱和選項。如果設定選項不存在,也可以指定預設值,該預設值將被回傳:
use Illuminate\Support\Facades\Config;
$value = Config::get('app.timezone');
$value = config('app.timezone');
// 如果設定值不存在,則取得預設值...
$value = config('app.timezone', 'Asia/Seoul');
若要在執行階段設定設定值,您可以呼叫 Config
Facade 的 set
方法,或傳遞一個陣列給 config
函式:
Config::set('app.timezone', 'America/Chicago');
config(['app.timezone' => 'America/Chicago']);
為了協助靜態分析,Config
Facade 也提供了具型別的設定值取得方法。如果取得的設定值與預期型別不符,將會拋出例外:
Config::string('config-key');
Config::integer('config-key');
Config::float('config-key');
Config::boolean('config-key');
Config::array('config-key');
設定快取
為了讓您的應用程式加速,您應該使用 config:cache
Artisan 指令將所有設定檔快取到單一檔案中。這會將應用程式的所有設定選項組合成一個單一檔案,框架可以快速載入。
您通常應該將 php artisan config:cache
指令作為生產部署流程的一部分執行。在本地開發期間不應執行此指令,因為在應用程式開發過程中,設定選項會經常需要變更。
一旦設定被快取,您的應用程式的 .env
檔案將不會在請求或 Artisan 指令期間由框架載入;因此,env
函式只會回傳外部的系統層級環境變數。
基於這個原因,您應該確保只在應用程式的設定 (config
) 檔案中呼叫 env
函式。您可以透過檢查 Laravel 的預設設定檔來看到許多範例。設定值可以透過上述的 config
函式從應用程式中的任何位置存取。
config:clear
指令可用於清除快取的設定:
php artisan config:clear
⚠️ 警告
如果您在部署流程中執行 config:cache
指令,請務必只在設定檔中呼叫 env
函式。一旦設定被快取,.env
檔案將不會被載入;因此,env
函式只會回傳外部、系統層級的環境變數。
發佈設定
Laravel 的大多數設定檔已發佈在您應用程式的 config
目錄中;然而,某些設定檔如 cors.php
和 view.php
預設未發佈,因為大多數應用程式無需修改它們。
不過,您可以使用 config:publish
Artisan 指令來發佈任何預設未發佈的設定檔:
php artisan config:publish
php artisan config:publish --all
偵錯模式
您的 config/app.php
設定檔中的 debug
選項決定了關於錯誤的資訊實際會向使用者顯示多少。預設情況下,此選項設定為尊重 APP_DEBUG
環境變數的值,該變數儲存在您的 .env
檔案中。
⚠️ 警告
對於本地開發,您應該將 APP_DEBUG
環境變數設定為 true
。在您的生產環境中,此值應始終為 false
。如果該變數在生產環境中設定為 true
,您可能會將敏感的設定值暴露給應用程式的終端使用者。
維護模式
當您的應用程式處於維護模式時,所有對應用程式的請求都將顯示一個自訂視圖。這使得在應用程式更新或執行維護作業時,「停用」應用程式變得容易。應用程式的預設中介層堆疊中包含了維護模式檢查。如果應用程式處於維護模式,將會拋出一個帶有 503 狀態碼的 Symfony\Component\HttpKernel\Exception\HttpException
實例。
若要啟用維護模式,請執行 down
Artisan 命令:
php artisan down
如果您希望所有維護模式回應都發送 Refresh
HTTP 標頭,您可以在呼叫 down
命令時提供 refresh
選項。Refresh
標頭將指示瀏覽器在指定秒數後自動重新整理頁面:
php artisan down --refresh=15
您也可以向 down
命令提供 retry
選項,該選項將被設定為 Retry-After
HTTP 標頭的值,儘管瀏覽器通常會忽略此標頭:
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
如果您希望 Laravel 為您產生秘密權杖,您可以使用 with-secret
選項。一旦應用程式處於維護模式,該秘密將會顯示給您:
php artisan down --with-secret
當您存取此隱藏路由時,您將被重新導向至應用程式的 /
路由。一旦 Cookie 已發出至您的瀏覽器,您就可以正常瀏覽應用程式,如同它沒有處於維護模式一樣。
📌 備註
您的維護模式秘密通常應由英數字元組成,並可選擇包含破折號。您應避免使用在 URL 中具有特殊含義的字元,例如 ?
或 &
。
多伺服器上的維護模式
預設情況下,Laravel 使用基於檔案的系統來判斷您的應用程式是否處於維護模式。這意味著要啟用維護模式,php artisan down
命令必須在託管您應用程式的每個伺服器上執行。
或者,Laravel 提供了一種基於快取的方法來處理維護模式。此方法只需在一個伺服器上執行 php artisan down
命令。若要使用此方法,請修改應用程式 .env
檔案中的維護模式變數。您應該選擇一個可供所有伺服器存取的快取 store
。這確保了維護模式狀態在每個伺服器上都能一致地維持:
APP_MAINTENANCE_DRIVER=cache
APP_MAINTENANCE_STORE=database
預渲染維護模式視圖
如果您在部署期間使用 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
定義您自己的模板來自訂預設的維護模式模板。
維護模式與佇列
當您的應用程式處於維護模式時,將不會處理任何 佇列作業。一旦應用程式脫離維護模式,這些作業將繼續正常處理。
維護模式的替代方案
由於維護模式需要您的應用程式有幾秒鐘的停機時間,因此請考慮使用像 Laravel Vapor 和 Envoyer 這樣的替代方案,以實現 Laravel 的零停機時間部署。