社交系统ThinkSNS+在研发过程当中,如何作到 Laravel 配置能够网站后台配置

什么是ThinkSNS+

  ThinkSNS(简称TS),一款全平台综合性社交系统,为国内外大中小企业和创业者提供社会化软件研发及技术解决方案。php

 

本文分享下利用 Laravel 的 Bootstrapping 达到网站后台设置 laravel 配置。laravel

TS+开发日记4副本.png

需求场景

首先,ThinkSNS+ 做为一个用户可使用的「社交系统」和开源网站程序同样拥有后台,有一些配置,Laravel 是要求写在 /config/*.php 的配置文件中的,例如 app.name、app.debug 等信息的配置,以及 Jobs 的驱动配置,广播系统的配置等,咱们都搬到了网站后台,用户安装后能够不用修改配置文件的状况下镜像配置。git

如何覆盖配置github

咱们首先打开 Illuminate\Foundation\Application::bootstrapWith 方法,代码以下:bootstrap

程序图片1.png

重点代码在 $this['events']->fire('bootstrapping: '.$bootstrapper, [$this]); 和 $this['events']->fire('bootstrapped: '.$bootstrapper, [$this]); 上,很明显是加载并运行 bootstrapper 的前置和后置事件。数组

因此,咱们看还有一个方法叫作 beforeBootstrapping 和 afterBootstrapping 而后怎么作呢?咱们看app

程序图片2.png

没错,这里是固定了顺序的,我错误的加载顺序,会形成laravel的失败,因此,咱们选择在以前继承 Illuminate\Foundation\Application 的应用基础上增长一个事件,代码以下:函数

程序图片3.png

哪里添加的事件网站

由于 ThinkSNS+ 是继承了 Illuminate\Foundation\Application 实现了新的 Application 类,因此咱们直接在构造方法里面增长了代码。
这样,当 Laravel 启动,可是尚未加载 bootstrapper 的时候,已经把 加载配置的后置事件注入进去了。当加载配置执行完成后就会执行我注入的后置事件。this

后置事件的实现

咱们在建立了 \Zhiyi\Plus\Bootstrap\LoadConfiguration 这样一个类,注册为后置事件,路径为: /app/Bootstrap/LoadConfiguration.php ,而后实现代码以下:

111.jpg

很简单,由于 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.png

而后调用 app('config')->set($arr) 就对 Laravel 的 config 进行了 depth merge。
最后,持久化保存的 YAML 内容以下:

程序图片6.png

因此,基于 depth merge 在 .plus.yml 配置中,只须要保存部分配置,便可不想配置结构的完整性的状况下对 Laravel 镜像配置合并。

源码受权购买

现行稳定系统V4系列全端产品(PC / H5 / APP)受权源码购买,产品体验,请致电:18108035545

开源版源码官方正版获取惟一渠道:关注公众号“thinksns”,回复“开源版”便可得到最新源码压缩文件地址。

开源代码仓库:

GitHub:https://github.com/zhiyicx/thinksns-plus(点击star,每日关注开发动态。)

相关文章
相关标签/搜索