如何做到 Laravel 配置可以网站后台配置【社交系统ThinkSNS+研发日记四】
距离上一次分享差不多一周了,本文分享下利用 Laravel 的 Bootstrapping 达到网站后台设置 laravel 配置。
需求场景
首先,ThinkSNS+ 作为一个用户可以使用的「社交系统」和开源网站程序一样拥有后台,有一些配置,Laravel 是要求写在 /config/*.php 的配置文件中的,例如 app.name、app.debug 等信息的配置,以及 Jobs 的驱动配置,广播系统的配置等,我们都搬到了网站后台,用户安装后可以不用修改配置文件的情况下镜像配置。
如何覆盖配置
我们首先打开 Illuminate\Foundation\Application::bootstrapWith 方法,代码如下:
重点代码在 $this['events']->fire('bootstrapping: '.$bootstrapper, [$this]); 和 $this['events']->fire('bootstrapped: '.$bootstrapper, [$this]); 上,很明显是加载并运行 bootstrapper 的前置和后置事件。
所以,我们看还有一个方法叫做 beforeBootstrapping 和 afterBootstrapping 然后怎么做呢?我们看
没错,这里是固定了顺序的,我错误的加载顺序,会造成laravel的失败,所以,我们选择在之前继承 Illuminate\Foundation\Application 的应用基础上增加一个事件,代码如下:
哪里添加的事件
因为 ThinkSNS+ 是继承了 Illuminate\Foundation\Application 实现了新的 Application 类,所以我们直接在构造方法里面增加了代码。
这样,当 Laravel 启动,但是还没有加载 bootstrapper 的时候,已经把 加载配置的后置事件注入进去了。当加载配置执行完成后就会执行我注入的后置事件。
后置事件的实现
我们在创建了 \Zhiyi\Plus\Bootstrap\LoadConfiguration 这样一个类,注册为后置事件,路径为: /app/Bootstrap/LoadConfiguration.php ,然后实现代码如下:
很简单,因为 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 这样的形式进行深曾键值赋值,利用这一个特性,这个函数将 多维数组转换为一维。
效果:
然后调用 app('config')->set($arr) 就对 Laravel 的 config 进行了 depth merge。
最后,持久化保存的 YAML 内容如下:
所以,基于 depth merge 在 .plus.yml 配置中,只需要保存部分配置,即可不想配置结构的完整性的情况下对 Laravel 镜像配置合并。
开源版源码官方正版获取唯一渠道:关注公众号“thinksns”,回复“开源版”即可获得最新源码压缩文件地址。
开源代码仓库:
GitHub:https://github.com/zhiyicx/thinksns-plus(点击star,每日关注开发动态。)
开源不易,为了争取开源,我们团队做了很多努力。把基于Laravel的作品展示在大家面前,之后专栏会持续不断的分享ThinkSNS +开发过程中的技术细节。
能看见这里的,一定是真爱~谢谢你们的爱
如何做到 Laravel 配置可以网站后台配置【社交系统ThinkSNS+研发日记四】的更多相关文章
- 【社交系统ThinkSNS+研发日记三】基于 Laravel Route 的 ThinkSNS+ Component
[社交系统ThinkSNS+研发日记系列] 一.<ThinkSNS+ 基于 Laravel master 分支,从 1 到 0,再到 0.1> 二.<基于 Laravel 开发 Th ...
- 社交系统ThinkSNS+在研发过程中,如何做到 Laravel 配置可以网站后台配置
什么是ThinkSNS+ ThinkSNS(简称TS),一款全平台综合性社交系统,为国内外大中小企业和创业者提供社会化软件研发及技术解决方案. 本文分享下利用 Laravel 的 Bootstrapp ...
- 基于 Laravel 开发 ThinkSNS+ 中前端的抉择(webpack/Vue)踩坑日记【ThinkSNS+研发日记系列】
在上一篇文章< ThinkSNS+基于Laravel master分支,从1到 0,再到0.1>,简单的介绍了 社群系统ThinkSNS+ ,这里分享在开发过程中,前端选择的心理活动. L ...
- 基于 Laravel、Vue.js开发的全新社交系统----ThinkSNS+
什么是ThinkSNS+ ThinkSNS(简称TS)始于2008年,一款全平台综合性社交系统,为国内外大中小企业和创业者提供社会化软件研发及技术解决方案,目前最新版本为ThinkSNS+.新的产品名 ...
- 【社交系统研发日记】如何在 Laravel 中 “规范” 的开发验证码发送功能
顺便发个小通知:7月15日ThinkSNS+开源版发布,同时非开源的APP也走出内测阶段,体验二维码也全面发布体验. 什么是ThinkSNS ? ThinkSNS(简称TS),一款全平台综合性社交系统 ...
- 【开源社交系统研发日记】利用 Docker 包 Laradock 服务器部署 Laravel & ThinkSNS+ 等程序实战(多项目)
什么是ThinkSNS+ ThinkSNS(简称TS),一款全平台综合性社交系统,为国内外大中小企业和创业者提供社会化软件研发及技术解决方案,目前最新版本为ThinkSNS+. 前段时间不知道抽上面疯 ...
- magento安装新插件后后台配置空白解决办法
前段时间,安装完Magento插件以后,就会出现空白或者404问题,在某些运营中的magento网站,安装新插件后后台配置空白解决. 1 将sysytem->toos->Compilati ...
- composer启用国内镜像网站的配置更改办法
用法: 有两种方式启用本镜像服务: 将以下配置信息添加到 Composer 的配置文件 config.json 中(系统全局配置).见“例1” 将以下配置信息添加到你的项目的 composer.jso ...
- 解决window2012 IIS8 配置的网站无法下载exe文件的问题
window2012 IIS8 配置网站下载exe文件.解决window2012 IIS8 配置的网站无法下载exe文件的问题 配置好网站后,无法下载网站上的exe文件,zip文件确可以下载的.右键点 ...
随机推荐
- 利用java反射机制编写solr通用的java客户端
一.前言 通过上一篇的讲解,我们知道了dynamicFiled字段,它是动态的,不需要显示的声明.而且一些常用的基本类型solr已经默认给我们创建好了. 例如:*_i,*_is,等. 如果我们要使用动 ...
- gulp 入门指南
gulp 是基于 node 实现 Web 前端自动化开发的工具,利用它能够极大的提高开发效率. 在 Web 前端开发工作中有很多"重复工作",比如压缩CSS/JS文件.而这些工作都 ...
- Python 操作 MYSQL
本文介绍了 Python 操作 MYSQL.执行 SQL 语句.获取结果集.遍历结果集.取得某个字 段.获取表字段名.将图片插入数据库.执行事务等各种代码实例和详细介绍,代码居多, 是一桌丰盛唯美的代 ...
- (转载)Oracle10g 数据泵导出命令 expdp 使用总结(三)
原文链接:http://hi.baidu.com/edeed/item/19aa0df856da3e19a6298894 Oracle10g 数据泵导出命令 expdp 使用总结(一) 14. JOB ...
- 利用fputcsv导出数据备份数据
今天,分享一个利用fputcsv导出数据备份数据的方法,我也时看到些零零散散的代码,想着拼起来,所以我只提供些思路,以及简单的代码,至于怎么组合能够让它更强大,尽情去探索吧 讲之前先上一段获取数据库里 ...
- str-字符串功能介绍
叨逼叨:字符串的各个功能修改不是本身,本身不变,会产生新的值,需要赋值给新的变量来接收 以下 "举例" 是解释每个功能的实例 "举例"下一行是pycharm ...
- Logback 基础知识
1.Logback使用logback 是log4j的替代者,其需要slf4j.其配置文件主要有以下三种1. logback.groovy2. logback-test.xml3. logback.xm ...
- atlwin中不停发WM_PAINT消息原因分析
这里我们基于atlwin定义的窗口类SampleWindow继承自CWindowImpl(定义见atlwin.h),并注册了WM_PAINT消息处理函数OnPaint,注意,我们在OnPaint函数中 ...
- GET请求和POST请求的区别
request获取请求参数 最为常见的客户端传递参数方式有两种: 浏览器地址栏直接输入:一定是GET请求: 超链接:一定是GET请求: 表单:可以是GET,也可以是POST,这取决与<form& ...
- jvm004 解析与分派
解析 所有方法调用中的目标方法在Class文件里面都是常量池中的符号引用,在类加载的解析阶段,会将其中的一部分符号引用转化为直接引用.这种解析的前提是:方法在程序真正运行之前就有一个可确定的调用版本, ...