V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Zhiyicx
V2EX  ›  程序员

社交系统 ThinkSNS+在研发过程中,如何做到 Laravel 配置可以网站后台配置

  •  
  •   Zhiyicx · 2017-05-22 16:51:27 +08:00 · 1673 次点击
    这是一个创建于 2745 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这里是传送门——开发日记系列

    《 ThinkSNS+基于 Laravel master 分支》

    《 ThinkSNS+研发中前端的抉择( webpack/Vue )踩坑日记》

    《基于 Laravel Route 的 ThinkSNS+ Component 》

    什么是 ThinkSNS+

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

    距离上一次分享差不多一周了,本文分享下利用 Laravel 的 Bootstrapping 达到网站后台设置 laravel 配置。

    Alt text

    需求场景

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

    如何覆盖配置

    我们首先打开 Illuminate\Foundation\Application::bootstrapWith 方法,代码如下:

    Alt text

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

    所以,我们看还有一个方法叫做 beforeBootstrapping 和 afterBootstrapping 然后怎么做呢?我们看

    Alt text

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

    Alt text

    哪里添加的事件

    因为 ThinkSNS+ 是继承了 Illuminate\Foundation\Application 实现了新的 Application 类,所以我们直接在构造方法里面增加了代码。 这样,当 Laravel 启动,但是还没有加载 bootstrapper 的时候,已经把 加载配置的后置事件注入进去了。当加载配置执行完成后就会执行我注入的后置事件。

    后置事件的实现

    我们在创建了 \Zhiyi\Plus\Bootstrap\LoadConfiguration 这样一个类,注册为后置事件,路径为: /app/Bootstrap/LoadConfiguration.php,然后实现代码如下: Alt text

    很简单,因为 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 这样的形式进行深曾键值赋值,利用这一个特性,这个函数将 多维数组转换为一维。 效果: Alt text

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

    所以,基于 depth merge 在 .plus.yml 配置中,只需要保存部分配置,即可不想配置结构的完整性的情况下对 Laravel 镜像配置合并。

    开源代码仓库

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

    咨询 QQ:3298713109

    官网:http://www.thinksns.com/

    内测申请方式

    提供个人 /企业联系方式及认证信息(实名 ID /企业营业执照照片或扫描件)及申请说明,发送邮件至 [email protected] 将有机会获得首批内测资格,名额有限,申请从速。

    参与内测请提供以下资料

    1 个可接收验证码的手机号

    1 个指定邮箱

    1 位测试人员姓名

    1 个您喜欢的账号昵称

    开源不易,为了争取开源,我们团队做了很多努力。把基于 Laravel 的作品展示在大家面前,之后专栏会持续不断的分享 ThinkSNS +开发过程中的技术细节。

    能看见这里的,一定是真爱~谢谢你们的爱

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2930 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:51 · PVG 22:51 · LAX 06:51 · JFK 09:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.