本文分享下利用 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 方法进行持久化。测试
为何要特殊说一下这个方法?由于这个方法的特殊性,也是 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 +开发过程当中的技术细节。