天天看點

如何做到 Laravel 配置可以網站背景配置?

本文分享下利用 Laravel 的 Bootstrapping 達到網站背景設定 laravel 配置。

需求場景

如何覆寫配置

我們首先打開 IlluminateFoundationApplication::bootstrapWith 方法,代碼如下:

如何做到 Laravel 配置可以網站背景配置?

重點代碼在 $this['events']->fire('bootstrapping: '.$bootstrapper, [$this]); 和 $this['events']->fire('bootstrapped: '.$bootstrapper, [$this]); 上,很明顯是加載并運作 bootstrapper 的前置和後置事件。

是以,我們看還有一個方法叫做 beforeBootstrapping 和 afterBootstrapping 然後怎麼做呢?我們看

如何做到 Laravel 配置可以網站背景配置?

沒錯,這裡是固定了順序的,我錯誤的加載順序,會造成laravel的失敗,是以,我們選擇在之前繼承 IlluminateFoundationApplication 的應用基礎上增加一個事件,代碼如下:

如何做到 Laravel 配置可以網站背景配置?

哪裡添加的事件

因為 ThinkSNS+ 是繼承了 IlluminateFoundationApplication 實作了新的 Application 類,是以我們直接在構造方法裡面增加了代碼。

這樣,當 Laravel 啟動,但是還沒有加載 bootstrapper 的時候,已經把 加載配置的後置事件注入進去了。當加載配置執行完成後就會執行我注入的後置事件。

後置事件的實作

我們在建立了 ZhiyiPlusBootstrapLoadConfiguration 這樣一個類,注冊為後置事件,路徑為: /app/Bootstrap/LoadConfiguration.php ,然後實作代碼如下:

如何做到 Laravel 配置可以網站背景配置?

很簡單,因為 app('config') 是一個 IlluminateContractsConfigRepository 接口的執行個體,是以直接調用 set 方法進行配置覆寫。

而 ZhiyiPlusSupportConfiguration 類是封裝的自定義配置加載類,加載的配置檔案存放在一個 YAML 檔案中,這個類實作了 自定義配置檔案的加載和儲存。這樣,我們從背景調用 API 然後 constroller 調用這個類的 save 方法進行持久化。

ZhiyiPlusSupportConfiguration::getConfigurationBase

為什麼要特殊說一下這個方法?因為這個方法的特殊性,也是 depth merge 實作的重要函數,在 Repository 中支援 app.name = value 這樣的形式進行深曾鍵值指派,利用這一個特性,這個函數将 多元數組轉換為一維。

效果:

如何做到 Laravel 配置可以網站背景配置?

然後調用 app('config')->set($arr) 就對 Laravel 的 config 進行了 depth merge。

最後,持久化儲存的 YAML 内容如下:

如何做到 Laravel 配置可以網站背景配置?

是以,基于 depth merge 在 .plus.yml 配置中,隻需要儲存部配置設定置,即可不想配置結構的完整性的情況下對 Laravel 鏡像配置合并。

開源代碼倉庫: