如何作到 Laravel 配置能夠網站後臺配置【社羣系統ThinkSNS+研發日記四】

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

需求場景

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

如何覆蓋配置

咱們首先打開 IlluminateFoundationApplication::bootstrapWith 方法,代碼以下:git

圖片描述

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

因此,咱們看還有一個方法叫作 beforeBootstrapping 和 afterBootstrapping 而後怎麼作呢?咱們看bootstrap

圖片描述

沒錯,這裏是固定了順序的,我錯誤的加載順序,會形成laravel的失敗,因此,咱們選擇在以前繼承 IlluminateFoundationApplication 的應用基礎上增長一個事件,代碼以下:數組

圖片描述

哪裏添加的事件

由於 ThinkSNS+ 是繼承了 IlluminateFoundationApplication 實現了新的 Application 類,因此咱們直接在構造方法裏面增長了代碼。
這樣,當 Laravel 啓動,可是尚未加載 bootstrapper 的時候,已經把 加載配置的後置事件注入進去了。當加載配置執行完成後就會執行我注入的後置事件。app

後置事件的實現

咱們在建立了 ZhiyiPlusBootstrapLoadConfiguration 這樣一個類,註冊爲後置事件,路徑爲: /app/Bootstrap/LoadConfiguration.php ,而後實現代碼以下:函數

圖片描述

很簡單,由於 app('config') 是一個 IlluminateContractsConfigRepository 接口的實例,因此直接調用 set 方法進行配置覆蓋。
而 ZhiyiPlusSupportConfiguration 類是封裝的自定義配置加載類,加載的配置文件存放在一個 YAML 文件中,這個類實現了 自定義配置文件的加載和保存。這樣,咱們從後臺調用 API 而後 constroller 調用這個類的 save 方法進行持久化。測試

ZhiyiPlusSupportConfiguration::getConfigurationBase

爲何要特殊說一下這個方法?由於這個方法的特殊性,也是 depth merge 實現的重要函數,在 Repository 中支持 app.name = value 這樣的形式進行深曾鍵值賦值,利用這一個特性,這個函數將 多維數組轉換爲一維。
效果:
圖片描述網站

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

圖片描述

因此,基於 depth merge 在 .plus.yml 配置中,只須要保存部分配置,便可不想配置結構的完整性的狀況下對 Laravel 鏡像配置合併。

開源代碼倉庫

GitHub:https://github.com/zhiyicx/th...(點擊star,每日關注開發動態。)

ThinkSNS官網:http://www.thinksns.com/

內測申請方式

  提供我的/企業聯繫方式及認證信息(實名ID /企業營業執照照片或掃描件)及申請說明,發送郵件至lihecong@zhishisoft.com將有機會得到首批內測資格,名額有限,申請從速。

  參與內測請提供如下資料

  1個可接收驗證碼的手機號;1個指定郵箱;1位測試人員姓名;1個您喜歡的帳號暱稱

  開源不易,爲了爭取開源,咱們團隊作了不少努力。把基於Laravel的做品展現在你們面前,以後專欄會持續不斷的分享ThinkSNS +開發過程當中的技術細節。

相關文章
相關標籤/搜索