跳至內容

設定

簡介

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

這些設定檔可讓您設定資料庫連線資訊、郵件伺服器資訊,以及各種其他核心設定值,例如應用程式時區和加密金鑰。

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 檔案包含一些常見的設定值,這些值可能會因您的應用程式是在本地執行還是在生產網頁伺服器上執行而有所不同。然後,config 目錄中的設定檔會使用 Laravel 的 env 函式讀取這些值。

如果您是與團隊一起開發,您可能會希望繼續包含和更新 .env.example 檔案以及您的應用程式。透過在範例設定檔中放入預留位置值,您團隊中的其他開發人員可以清楚地看到執行您的應用程式需要哪些環境變數。

lightbulb

您的 .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 外觀模式上的 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...
}
lightbulb

目前的應用程式環境偵測可以透過定義伺服器級 APP_ENV 環境變數來覆寫。

加密環境檔案

未加密的環境檔案永遠不應儲存在原始碼控制中。但是,Laravel 允許您加密環境檔案,以便可以安全地將它們與應用程式的其餘部分一起加入原始碼控制中。

加密

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

php artisan env:encrypt

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

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

提供的金鑰長度應符合所用加密密碼所需的金鑰長度。預設情況下,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 外觀模式或全域 config 函式來存取您的組態值。組態值可以使用「點」語法來存取,其中包含您要存取之檔案的名稱和選項。也可以指定預設值,如果組態選項不存在,則會傳回該預設值。

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

若要在執行階段設定組態值,您可以呼叫 Config 外觀模式的 set 方法,或將陣列傳遞給 config 函式。

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

為了協助進行靜態分析,Config 外觀模式還提供了型別化的組態擷取方法。如果擷取的組態值與預期的類型不符,則會拋出例外。

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
exclamation

如果您在部署過程中執行 config:cache 命令,您應該確保只在組態檔案中呼叫 env 函式。一旦組態被快取後,.env 檔案將不會被載入;因此,env 函式只會傳回外部的系統級別環境變數。

發佈設定

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

但是,您可以使用 config:publish Artisan 命令來發佈任何預設未發佈的組態檔案。

php artisan config:publish
 
php artisan config:publish --all

除錯模式

您的 config/app.php 組態檔案中的 debug 選項決定了實際向使用者顯示多少錯誤資訊。預設情況下,此選項設定為尊重 .env 檔案中儲存的 APP_DEBUG 環境變數的值。

exclamation

對於本地開發,您應該將 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 發送到您的瀏覽器,您就可以像應用程式未處於維護模式一樣正常瀏覽應用程式。

lightbulb

您的維護模式秘密通常應包含字母數字字符,並且可選擇包含破折號。您應避免使用在 URL 中具有特殊含義的字符,例如 ?&

多個伺服器上的維護模式

預設情況下,Laravel 使用基於檔案的系統來判斷您的應用程式是否處於維護模式。這表示若要啟動維護模式,必須在每個託管您應用程式的伺服器上執行 php artisan down 命令。

或者,Laravel 提供了一種基於快取的維護模式處理方法。此方法只需要在一個伺服器上執行 php artisan down 命令。若要使用此方法,請將應用程式 config/app.php 檔案中的「driver」設定修改為 cache。然後,選擇一個所有伺服器都可以存取的快取 store。這確保了維護模式狀態在每個伺服器上都能一致地保持。

'maintenance' => [
'driver' => 'cache',
'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
lightbulb

您可以通過在 resources/views/errors/503.blade.php 定義您自己的範本來自定義預設的維護模式範本。

維護模式和佇列

當您的應用程式處於維護模式時,不會處理任何佇列作業。一旦應用程式退出維護模式,這些作業將繼續正常處理。

維護模式的替代方案

由於維護模式需要您的應用程式有幾秒鐘的停機時間,請考慮使用 Laravel VaporEnvoyer 等替代方案,以使用 Laravel 實現零停機部署。