.env,還是該放進資料庫?「這個第三方追蹤碼要改,是不是改一下 .env 重新部署就好?」
這句話背後藏著一個很多專案都會遇到的判斷題:一個設定值,到底該放在 .env 這種「改了要重新部署」的地方,還是該放進資料庫、讓非工程師的人也能在後台直接改?今天用一個真實的演進案例,看這個判斷題實際上是怎麼被回答的。
spatie/laravel-settings 這類套件在解決什麼問題.env,什麼值該搬進 settings.env 檔案存放的設定值,本質上是「跟部署環境綁定」的東西——資料庫連線資訊、API 金鑰、這台伺服器專屬的參數。改動 .env 通常代表要重新部署(或至少要重啟服務讓設定生效),而且改動這個檔案需要碰程式碼倉庫或伺服器權限,一般不會開放給非工程師的人直接操作。
資料庫裡的設定值則完全相反:改了立刻生效,不需要重新部署,而且可以透過一個後台介面讓沒有工程背景的人(例如行銷、營運人員)自己去改。
這個系列的素材專案裡,有一個具體的真實案例,示範了一個設定值從第一種存放方式,演進到第二種。
在某次 commit 紀錄裡,可以看到這樣的描述:後台新增了 Google Analytics ID 跟 Search Console 驗證碼的設定欄位,緊接著另一次 commit 把這兩個追蹤碼相關的設定,從原本寫死的方式,改成後台可管理。
這個演進背後的真實情境很容易想像:Google Analytics 的追蹤 ID、Search Console 的驗證碼,這類第三方服務的識別碼,通常是行銷或 SEO 負責人要處理的東西——申請一個新的追蹤帳號、或是驗證網域所有權,都不是工程師的工作範圍。如果這些值寫死在程式碼或 .env 裡,每次要換一個追蹤碼,行銷人員都要去麻煩工程師改設定、重新部署——這個流程摩擦力很大,也完全沒有必要。
改成後台可設定之後,行銷人員自己在後台輸入新的追蹤碼,儲存,立刻生效,完全不需要工程師介入。
spatie/laravel-settings 在解決什麼問題這個系列的素材專案用 spatie/laravel-settings 這個套件來管理這類設定。這個套件的核心概念是:定義一個一般的 PHP 類別,裡面用型別化的屬性描述每個設定欄位(字串、布林值、陣列都可以),套件負責把這個類別的實例跟資料庫的一張表對應起來——讀取時從資料庫載入成這個類別的物件,寫入時把物件的屬性值存回資料庫。
用程式碼層面來看,一個典型的設定類別長這樣:
class GeneralSettings extends Settings
{
public string $site_name;
public array $related_links = [];
public bool $sso_login = true;
public ?string $google_analytics_id = '';
public ?string $google_site_verification = '';
public static function group(): string
{
return 'general';
}
}
要讀取設定值,寫法就跟存取一般物件的屬性一樣直覺:
$siteName = app(GeneralSettings::class)->site_name;
不需要記憶字串鍵值(不像 config('some.nested.key') 這種寫法),不需要自己刻一張資料表存 key-value pair、也不需要自己寫讀寫邏輯——套件把這些機械性的工作都包掉了,你只需要專心定義「這個設定群組有哪些欄位」。
.env,什麼值該搬進 settings看完這個案例,可以整理出一個實用的判斷依據:
留在 .env 的值,通常符合:
- 跟部署環境本身綁定(資料庫連線、快取驅動、金鑰)
- 只有工程師需要碰、改動天生需要搭配部署流程
- 敏感到不該出現在資料庫裡(雖然資料庫也需要妥善保護,
但 .env 至少不會被一般後台操作者間接查詢到)
適合搬進資料庫(例如用 settings 套件)的值,通常符合:
- 非工程背景的人(行銷、營運、內容編輯)需要能自己改
- 改動頻率高到「每次都要麻煩工程師重新部署」變成明顯的流程摩擦
- 改動本身不需要伴隨程式碼邏輯變動,純粹是一個數值/文字的調整
第三方追蹤碼完全符合第二種情況——這正是為什麼這個系列的素材專案,會把它從寫死的方式搬進後台可設定的 settings。
(這個系列刻意不展開後台介面本身怎麼串接這個 settings 類別——那牽涉到專案用的後台管理套件,不是這個系列要講的範圍。這裡只講 Settings 類別本身的定義方式跟讀寫方式,這部分是純 Laravel/套件層級的知識,跟後台用什麼工具開發無關。)
回想你專案裡目前寫死在 .env 或程式碼裡的設定值,有沒有哪一個其實符合「非工程背景的人需要能自己改、改動頻率不低」這個條件,但至今還是要麻煩工程師才能改?
.env 設定值跟資料庫設定值的根本差異:前者跟部署環境綁定、只有工程師能改;後者改了立刻生效、可以開放給非工程背景的人操作spatie/laravel-settings 用型別化的 PHP 類別描述設定欄位,讀寫都跟一般物件屬性一樣直覺.env
明天要拆解這個系列前面提過好幾次、但一直賣關子的那支複雜 middleware——它怎麼讓同一組路由,依照設定切換出兩套完全不同的畫面,而不是複製一份路由來做版本控制。