閱讀349 返回首頁    go 阿裏雲 go 技術社區[雲棲]


如何做到 Laravel 配置可以網站後台配置?

本文分享下利用 Laravel 的 Bootstrapping 達到網站後台設置 laravel 配置。

需求場景

首先,ThinkSNS+ 作為一個用戶可以使用的「社交係統」和開源網站程序一樣擁有後台,有一些配置,Laravel 是要求寫在 /config/*.php 的配置文件中的,例如 app.name、app.debug 等信息的配置,以及 Jobs 的驅動配置,廣播係統的配置等,我們都搬到了網站後台,用戶安裝後可以不用修改配置文件的情況下鏡像配置。

如何覆蓋配置

我們首先打開 Illuminate\Foundation\Application::bootstrapWith 方法,代碼如下:

_1

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

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

_2

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

_3

哪裏添加的事件

因為 ThinkSNS+ 是繼承了 Illuminate\Foundation\Application 實現了新的 Application 類,所以我們直接在構造方法裏麵增加了代碼。
這樣,當 Laravel 啟動,但是還沒有加載 bootstrapper 的時候,已經把 加載配置的後置事件注入進去了。當加載配置執行完成後就會執行我注入的後置事件。

後置事件的實現

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

_4

很簡單,因為 app('config') 是一個 Illuminate\Contracts\Config\Repository 接口的實例,所以直接調用 set 方法進行配置覆蓋。
而 Zhiyi\Plus\Support\Configuration 類是封裝的自定義配置加載類,加載的配置文件存放在一個 YAML 文件中,這個類實現了 自定義配置文件的加載和保存。這樣,我們從後台調用 API 然後 constroller 調用這個類的 save 方法進行持久化。

Zhiyi\Plus\Support\Configuration::getConfigurationBase

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

_5

然後調用 app('config')->set($arr) 就對 Laravel 的 config 進行了 depth merge。
最後,持久化保存的 YAML 內容如下:

_6

所以,基於 depth merge 在 .plus.yml 配置中,隻需要保存部分配置,即可不想配置結構的完整性的情況下對 Laravel 鏡像配置合並。

開源代碼倉庫:

GitHub:https://github.com/slimkit/thinksns-plus

最後更新:2017-09-27 15:34:15

  上一篇:go  智能語音質檢係統如何做到深度跟蹤分析客戶
  下一篇:go  走在專家的路上,每天一條SQL優化(2)