iT邦幫忙

2026 iThome 鐵人賽

DAY 26
0
Software Development

一套真實運作中的 Laravel 系統,拆解它的原生機制系列 第 26 篇

Day 26:套件化設定——第三方追蹤碼從寫死到後台可設定的真實演進

  • 分享至 

  • xImage
  •  

前言:這個值該放在 .env,還是該放進資料庫?

「這個第三方追蹤碼要改,是不是改一下 .env 重新部署就好?」

這句話背後藏著一個很多專案都會遇到的判斷題:一個設定值,到底該放在 .env 這種「改了要重新部署」的地方,還是該放進資料庫、讓非工程師的人也能在後台直接改?今天用一個真實的演進案例,看這個判斷題實際上是怎麼被回答的。

今日目標

  • 理解「.env 設定」跟「資料庫設定」兩種存放方式的根本差異
  • 看一個真實案例:第三方追蹤碼從寫死到後台可設定的演進過程
  • 認識 spatie/laravel-settings 這類套件在解決什麼問題
  • 建立一個判斷依據:什麼值該留在 .env,什麼值該搬進 settings

本文主體

兩種設定值存放方式的根本差異

.env 檔案存放的設定值,本質上是「跟部署環境綁定」的東西——資料庫連線資訊、API 金鑰、這台伺服器專屬的參數。改動 .env 通常代表要重新部署(或至少要重啟服務讓設定生效),而且改動這個檔案需要碰程式碼倉庫或伺服器權限,一般不會開放給非工程師的人直接操作。

資料庫裡的設定值則完全相反:改了立刻生效,不需要重新部署,而且可以透過一個後台介面讓沒有工程背景的人(例如行銷、營運人員)自己去改。

這個系列的素材專案裡,有一個具體的真實案例,示範了一個設定值從第一種存放方式,演進到第二種。

真實演進:Google Analytics 追蹤碼從哪裡搬到哪裡

在某次 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 設定值跟資料庫設定值的根本差異:前者跟部署環境綁定、只有工程師能改;後者改了立刻生效、可以開放給非工程背景的人操作
  • 真實演進案例:Google Analytics 追蹤碼從寫死的方式,變成後台可以直接設定的欄位
  • spatie/laravel-settings 用型別化的 PHP 類別描述設定欄位,讀寫都跟一般物件屬性一樣直覺
  • 判斷依據:改動頻率高、需要非工程背景的人自己操作的值,適合搬進資料庫;跟部署環境綁定的值,留在 .env

明日預告

明天要拆解這個系列前面提過好幾次、但一直賣關子的那支複雜 middleware——它怎麼讓同一組路由,依照設定切換出兩套完全不同的畫面,而不是複製一份路由來做版本控制。


上一篇
Day 25:Media Library 整合——覆寫一個方法,讓檔案路徑依 Model 好排查
系列文
一套真實運作中的 Laravel 系統,拆解它的原生機制 共 26 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言