跳轉至內容

配置

簡介

Laravel 框架的所有配置檔案都儲存在 config 目錄中。每個選項都有文件說明,請隨意瀏覽這些檔案,熟悉可用的選項。

這些配置檔案允許你配置諸如資料庫連線資訊、郵件伺服器資訊,以及各種其他核心配置值(如應用程式 URL 和加密金鑰)。

about 命令

Laravel 可以透過 about Artisan 命令顯示應用程式的配置、驅動程式和環境概覽。

1php artisan about

如果你只對應用程式概覽輸出的特定部分感興趣,可以使用 --only 選項進行過濾:

1php artisan about --only=environment

或者,要詳細探索特定配置檔案的值,可以使用 config:show Artisan 命令:

1php artisan config:show database

環境配置

根據應用程式執行的環境使用不同的配置值通常很有幫助。例如,你可能希望在本地使用與生產伺服器不同的快取驅動程式。

為了讓這一切變得簡單,Laravel 使用了 DotEnv PHP 庫。在全新的 Laravel 安裝中,應用程式的根目錄包含一個 .env.example 檔案,定義了許多常見的環境變數。在 Laravel 安裝過程中,該檔案會自動複製為 .env

Laravel 預設的 .env 檔案包含一些常見的配置值,這些值可能會根據應用程式是在本地執行還是在生產 Web 伺服器上執行而有所不同。這些值隨後會由 config 目錄中的配置檔案使用 Laravel 的 env 函式讀取。

如果你是在團隊中開發,你可能希望繼續在應用程式中包含並更新 .env.example 檔案。透過在示例配置檔案中放置佔位符值,團隊中的其他開發者可以清楚地看到執行應用程式需要哪些環境變數。

.env 檔案中的任何變數都可以被外部環境變數(例如伺服器級或系統級環境變數)覆蓋。

環境檔案安全性

你的 .env 檔案不應提交到應用程式的版本控制系統中,因為使用該應用程式的每個開發人員或伺服器可能需要不同的環境配置。此外,如果入侵者獲得了對版本控制倉庫的訪問許可權,這會帶來安全風險,因為任何敏感憑據都會被洩露。

不過,你可以使用 Laravel 內建的 環境加密功能對環境檔案進行加密。加密後的環境檔案可以安全地放入版本控制系統中。

附加環境檔案

在載入應用程式的環境變數之前,Laravel 會確定是否已從外部提供了 APP_ENV 環境變數,或者是否指定了 --env 命令列引數。如果是,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

如果你需要定義一個包含空格的環境變數值,可以透過將值括在雙引號中來實現:

1APP_NAME="My Application"

獲取環境配置

當應用程式接收到請求時,.env 檔案中列出的所有變數都將被載入到 $_ENV PHP 超全域性變數中。但是,你可以在配置檔案中使用 env 函式來獲取這些變數的值。事實上,如果你檢視 Laravel 的配置檔案,會發現許多選項已經在使用此函式。

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

傳遞給 env 函式的第二個值是“預設值”。如果給定的鍵沒有對應的環境變數,則返回此值。

確定當前環境

當前應用程式環境是透過 .env 檔案中的 APP_ENV 變數確定的。你可以透過 App 外觀(facade)上的 environment 方法訪問此值:

1use Illuminate\Support\Facades\App;
2 
3$environment = App::environment();

你也可以將引數傳遞給 environment 方法來確定環境是否匹配給定值。如果環境匹配任何給定的值,該方法將返回 true

1if (App::environment('local')) {
2 // The environment is local
3}
4 
5if (App::environment(['local', 'staging'])) {
6 // The environment is either local OR staging...
7}

透過定義伺服器級的 APP_ENV 環境變數,可以覆蓋當前的環境檢測。

加密環境檔案

未加密的環境檔案絕不應儲存在版本控制系統中。但是,Laravel 允許你加密環境檔案,以便它們可以與應用程式的其餘部分一起安全地新增到版本控制系統中。

加密

要加密環境檔案,可以使用 env:encrypt 命令:

1php artisan env:encrypt

執行 env:encrypt 命令會加密你的 .env 檔案並將加密內容放入 .env.encrypted 檔案中。解密金鑰會顯示在命令輸出中,應將其儲存在安全的密碼管理器中。如果你想提供自己的加密金鑰,可以在呼叫命令時使用 --key 選項。

1php artisan env:encrypt --key=3UVsEgGVK36XN82KKeyLFMhvosbZN1aF

提供的金鑰長度應符合所用加密演算法要求的金鑰長度。預設情況下,Laravel 使用 AES-256-CBC 演算法,該演算法需要 32 個字元的金鑰。你可以透過在呼叫命令時傳遞 --cipher 選項,隨意使用 Laravel 加密器支援的任何演算法。

如果你的應用程式有多個環境檔案(例如 .env.env.staging),你可以透過 --env 選項提供環境名稱,從而指定要加密的環境檔案。

1php artisan env:encrypt --env=staging

可讀變數名

在加密環境檔案時,可以使用 --readable 選項來保留可見的變數名,同時加密它們的值:

1php artisan env:encrypt --readable

這將生成一個具有以下格式的加密檔案:

1APP_NAME=eyJpdiI6...
2APP_ENV=eyJpdiI6...
3APP_KEY=eyJpdiI6...
4APP_DEBUG=eyJpdiI6...
5APP_URL=eyJpdiI6...

使用可讀格式可以讓你檢視存在哪些環境變數,而無需暴露敏感資料。它還使得審查拉取請求(pull requests)變得更加容易,因為你可以檢視新增、刪除或重新命名了哪些變數,而無需解密檔案。

在解密環境檔案時,Laravel 會自動檢測使用了哪種格式,因此 env:decrypt 命令不需要額外的選項。

使用 --readable 選項時,原始環境檔案中的註釋和空行不會包含在加密輸出中。

解密

要解密環境檔案,可以使用 env:decrypt 命令。該命令需要一個解密金鑰,Laravel 將從 LARAVEL_ENV_ENCRYPTION_KEY 環境變數中獲取該金鑰:

1php artisan env:decrypt

或者,可以透過 --key 選項將金鑰直接提供給命令:

1php artisan env:decrypt --key=3UVsEgGVK36XN82KKeyLFMhvosbZN1aF

當呼叫 env:decrypt 命令時,Laravel 將解密 .env.encrypted 檔案的內容,並將解密後的內容放入 .env 檔案中。

可以向 env:decrypt 命令提供 --cipher 選項,以便使用自定義的加密演算法。

1php artisan env:decrypt --key=qUWuNRdfuImXcKxZ --cipher=AES-128-CBC

如果你的應用程式有多個環境檔案(例如 .env.env.staging),你可以透過 --env 選項提供環境名稱,從而指定要解密的環境檔案。

1php artisan env:decrypt --env=staging

為了覆蓋現有的環境檔案,你可以為 env:decrypt 命令提供 --force 選項。

1php artisan env:decrypt --force

訪問配置值

你可以使用 Config 外觀或全域性 config 函式在應用程式的任何位置輕鬆訪問配置值。可以使用“點”語法訪問配置值,其中包括檔名和你想訪問的選項。也可以指定一個預設值,如果配置選項不存在,則會返回該預設值:

1use Illuminate\Support\Facades\Config;
2 
3$value = Config::get('app.timezone');
4 
5$value = config('app.timezone');
6 
7// Retrieve a default value if the configuration value does not exist...
8$value = config('app.timezone', 'Asia/Seoul');

要在執行時設定配置值,可以呼叫 Config 外觀的 set 方法,或者向 config 函式傳遞一個數組:

1Config::set('app.timezone', 'America/Chicago');
2 
3config(['app.timezone' => 'America/Chicago']);

為了輔助靜態分析,Config 外觀還提供了型別化的配置獲取方法。如果獲取的配置值與預期型別不匹配,將丟擲異常:

1Config::string('config-key');
2Config::integer('config-key');
3Config::float('config-key');
4Config::boolean('config-key');
5Config::array('config-key');
6Config::collection('config-key');

配置快取

為了給應用程式提速,你應該使用 config:cache Artisan 命令將所有配置檔案快取到單個檔案中。這將把應用程式的所有配置選項組合成一個檔案,框架可以快速載入該檔案。

你通常應該在生產部署過程中執行 php artisan config:cache 命令。該命令不應在本地開發期間執行,因為在應用程式開發過程中,配置選項經常需要更改。

一旦配置被快取,框架在處理請求或執行 Artisan 命令時將不會載入應用程式的 .env 檔案;因此,env 函式只會返回外部的、系統級的環境變數。

因此,你應該確保僅在應用程式的配置(config)檔案中呼叫 env 函式。透過檢視 Laravel 的預設配置檔案,你可以看到許多這樣的例子。應用程式中的任何位置都可以透過 上述描述的 config 函式來訪問配置值。

config:clear 命令可用於清除快取的配置:

1php artisan config:clear

如果你在部署過程中執行 config:cache 命令,請確保僅在配置檔案內呼叫 env 函式。一旦配置被快取,.env 檔案將不再被載入;因此,env 函式將只返回外部的、系統級的環境變數。

釋出配置檔案

大多數 Laravel 的配置檔案都已經發布在應用程式的 config 目錄中;但是,某些配置檔案(如 cors.phpview.php)預設不會發布,因為大多數應用程式永遠不需要修改它們。

不過,你可以使用 config:publish Artisan 命令來發布任何預設未釋出的配置檔案:

1php artisan config:publish
2 
3php artisan config:publish --all

除錯模式

config/app.php 配置檔案中的 debug 選項決定了向用戶顯示多少關於錯誤的資訊。預設情況下,此選項設定為遵循 .env 檔案中儲存的 APP_DEBUG 環境變數的值。

對於本地開發,你應該將 APP_DEBUG 環境變數設定為 true在生產環境中,該值應始終為 false。如果該變數在生產環境中設定為 true,則有嚮應用程式終端使用者洩露敏感配置值的風險。

維護模式

當應用程式處於維護模式時,所有請求都將顯示一個自定義檢視。這使得在應用程式更新或進行維護時可以輕鬆地“停用”它。維護模式檢查已包含在應用程式的預設中介軟體棧中。如果應用程式處於維護模式,將丟擲狀態碼為 503 的 Symfony\Component\HttpKernel\Exception\HttpException 例項。

要啟用維護模式,請執行 down Artisan 命令:

1php artisan down

如果你希望所有維護模式響應都包含 Refresh HTTP 頭,可以在呼叫 down 命令時提供 refresh 選項。Refresh 頭將指示瀏覽器在指定的秒數後自動重新整理頁面:

1php artisan down --refresh=15

你也可以向 down 命令提供 retry 選項,它將作為 Retry-After HTTP 頭的值,儘管瀏覽器通常會忽略此頭資訊:

1php artisan down --retry=60

繞過維護模式

為了允許使用金鑰令牌繞過維護模式,你可以使用 secret 選項指定維護模式繞過令牌:

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

將應用程式置於維護模式後,你可以導航到與此令牌匹配的應用程式 URL,Laravel 將向你的瀏覽器頒發一個維護模式繞過 cookie:

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

如果你希望 Laravel 為你生成金鑰令牌,可以使用 with-secret 選項。當應用程式處於維護模式後,金鑰將顯示給你:

1php artisan down --with-secret

訪問此隱藏路由後,你將被重定向到應用程式的 / 路由。一旦 cookie 頒發給你的瀏覽器,你就可以像應用程式未處於維護模式一樣正常瀏覽它。

你的維護模式金鑰通常應由字母數字字元組成,並可選擇包含短橫線。應避免使用在 URL 中具有特殊含義的字元,例如 ?&

多伺服器上的維護模式

預設情況下,Laravel 使用基於檔案的系統來確定應用程式是否處於維護模式。這意味著要啟用維護模式,必須在託管應用程式的每臺伺服器上執行 php artisan down 命令。

或者,Laravel 提供了一種基於快取的方法來處理維護模式。此方法只需在其中一臺伺服器上執行 php artisan down 命令。要使用此方法,請修改應用程式 .env 檔案中的維護模式變數。你應該選擇一個所有伺服器都可以訪問的快取 store。這可以確保維護模式狀態在每臺伺服器上保持一致。

1APP_MAINTENANCE_DRIVER=cache
2APP_MAINTENANCE_STORE=database

預渲染維護模式檢視

如果你在部署期間使用 php artisan down 命令,當用戶在 Composer 依賴項或其他基礎設施元件更新時訪問應用程式,他們有時仍可能遇到錯誤。這是因為 Laravel 框架的很大一部分必須啟動才能確定應用程式處於維護模式並使用模板引擎渲染維護模式檢視。

因此,Laravel 允許你預渲染一個維護模式檢視,該檢視將在請求週期的最開始返回。此檢視在載入任何應用程式依賴項之前渲染。你可以使用 down 命令的 render 選項預渲染你選擇的模板:

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

重定向維護模式請求

在維護模式下,Laravel 將為使用者嘗試訪問的所有應用程式 URL 顯示維護模式檢視。如果你願意,可以指示 Laravel 將所有請求重定向到特定 URL。這可以使用 redirect 選項實現。例如,你可能希望將所有請求重定向到 / URI:

1php artisan down --redirect=/

停用維護模式

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

1php artisan up

你可以透過在 resources/views/errors/503.blade.php 定義自己的模板來定製預設的維護模式模板。

維護模式與佇列

當應用程式處於維護模式時,不會處理任何 佇列任務。一旦應用程式退出維護模式,任務將恢復正常處理。

維護模式的替代方案

由於維護模式需要應用程式停機幾秒鐘,請考慮在像 Laravel Cloud 這樣的全託管平臺上執行你的應用程式,以實現 Laravel 的零停機部署。