Lumen配置文件按需加载出现的坑
问题描述
公司一个高并发API需要从Laravel移植到Lumen,由于数据库配置信息是通过远程或者缓存读取后动态配置,所以在中间件时使用到了 Config::set
然而实际运行时发现数据库配置并没有更新。
由于是从Laravel移植,因此保留了Facades的写法,Lumen中可以通过以下方法使用Facades:
取消
bootstarp/app.php
中$app->withFacades();
的注释use Illuminate\Support\Facades\XXX
另一方面,系统使用 Redis
作为缓存,通过 env
配置 Redis
,配置信息存储在 config/database.php
在没有使用数据库先使用缓存的情况下,报没有传配置项的错误。
问题分析
通过阅读源码 laravel/lumen-framework/src/Application.php
发现,Lumen中的服务都是按需绑定并加载。先来看看 make()
的代码:
public function make($abstract, array $parameters = [])
{$abstract = $this->getAlias($this->normalize($abstract));if (array_key_exists($abstract, $this->availableBindings) &&! array_key_exists($this->availableBindings[$abstract], $this->ranServiceBinders)) {$this->{$method = $this->availableBindings[$abstract]}();$this->ranServiceBinders[$method] = true;}return parent::make($abstract, $parameters);
}
Lumen通过数组 $availableBindings
实现了基本服务的按需绑定并加载。在服务按需绑定并加载的时候,使用了类似组件的形式通过 loadComponent()
载入配置项并绑定服务。再来看看 loadComponent()
的代码:
public function loadComponent($config, $providers, $return = null)
{$this->configure($config);foreach ((array) $providers as $provider) {$this->register($provider);}return $this->make($return ?: $config);
}
如此就释然为什么在中间件以及使用 DB
之前想要动态配置数据库的信息时无法正确的写入配置项了。因为在这个时候 DB
的相关配置文件还没有被载入。你先写入了配置项当使用 DB
的时候会再次载入配置文件中的配置项覆盖动态写入的内容。
同理,使用 Redis
时,由于 Redis
相关配置是写在 database.php
里的,仅仅通过 $app->register(Illuminate\Redis\RedisServiceProvider::class);
注册是无法获取到配置项,如果在使用 Redis
时之前没有使用 DB
就会报没有传配置项的错误。
解决方案
既然找到了问题所在,要解决起来也是很方便的。只要在修改、使用配置项之前先载入配置文件就可以解决这些问题。比如:
使用
app()->configure('database');
载入所需要的配置文件在注册绑定服务到服务容器的时候使用
loadComponent
进行注册绑定
欢迎关注我的博客 http://targetliu.com
Lumen配置文件按需加载出现的坑相关推荐
- php拓展板块 按需开启,php如何按需加载方式来增加程序的灵活度
设计模式的命名啊什么的,我基本上已经忘记得差不多了,我就把我现在表述的这个东西叫做按需加载吧. 需求: 1.我希望有一个配置文件读写类,不需要修改原本这个配置文件读写类就可以实现扩展: 2.这个扩展是 ...
- ant design pro取消登录_JeecgBoot实战按需加载 Ant-Design-Vue和Icon
一.Ant-Design-Vue 按需加载 1.创建js文件 src/components/lazy_antd.js import Vue from 'vue'// base library impo ...
- React单页如何规划路由、设计Store、划分模块、按需加载
本项目地址:react-coat-helloworld react-coat 同时支持浏览器渲染(SPA)和服务器渲染(SSR),本 Demo 仅演示浏览器渲染,请先了解一下:react-coat 第 ...
- php按需加载方式来增加程序的灵活度
设计模式的命名啊什么的,我基本上已经忘记得差不多了,我就把我现在表述的这个东西叫做按需加载吧. 需求: 1.我希望有一个配置文件读写类,不需要修改原本这个配置文件读写类就可以实现扩展: 2.这个扩展是 ...
- Ant-Design-Vue和Icon按需加载方案 - JeecgBoot实战
JeecgBoot实战 - 按需加载方案 文章目录 JeecgBoot实战 - 按需加载方案 一.Ant-Design-Vue 按需加载 二.Icon按需加载 一.Ant-Design-Vue 按需加 ...
- vue按需加载组件_微人事首页加载速度提高了 5 倍,我都做了什么?
「本文之前发过,但是比较零散,这里我把用到的方案都汇总一下,方便大家索引,有需要的小伙伴可以收藏下方便查找.里边提到的几种方案,大家都可以对照着视频试一下」 ElementUI 按需加载: 服务端开启 ...
- vue tree组件_Ant-Design-Vue和Icon按需加载方案 - JeecgBoot实战
JeecgBoot实战 - 按需加载方案 一.Ant-Design-Vue 按需加载 1.创建js文件 src/components/lazy_antd.js import Vue from 'vue ...
- 快速搭建react项目骨架(按需加载、redux、axios、项目级目录等等)
一.前言 最近整理了一下项目骨架,顺便自定义了一个脚手架,方便日后使用.我会从头开始,步骤一步步写明白,如果还有不清楚的可以评论区留言.先大致介绍一下这个骨架,我们采用 create-react-ap ...
- echarts中x轴文件消失_百度Echarts图表在Vue项目的完整引入以及按需加载
导语 近日在项目中需要进行图表展示,百度的Echarts图表是非常合适的一个选择.项目是vue-cli搭建的,如何在项目中引入Echarts就是一个问题了.亲自动手实践了下,整理总结,希望对小伙伴提供 ...
最新文章
- elasticsearch 分片_Elasticsearch教程:动手实践
- 关于绑定IP地址与端口号的见解
- python之路_文件操作解析
- 【 c语言中无符号和有符号的加法运算】【深入理解】--【sky原创】
- java查看jdk源码_Java-如何查看JDK源码
- linux磁盘权限 /srv,Linux学习笔记之解压压缩,磁盘分区,软件包管理,权限
- bash error 环境变量错误
- 软件测试核心之用例设计
- 那些前端应该知道的HTTP知识
- python 闭包,装饰器,random,os,sys,shutil,shelve,ConfigParser,hashlib模块
- 手把手带你从0搭建一个Golang ORM框架(上)!
- asp.net配置文件connectionStrings加密和解密
- SSL安全证书过期的原因及解决方法
- 抖音运营从内容开始做起,抖音内容创作
- 三屏指挥调调度终端/三屏计算机/一机三屏指挥调度/三屏融合指挥调度
- CSS设置高斯模糊效果
- IOS多线程使用GCD与信号量实现生产者与消费者模式
- eclipese web前端开发教学_Web 前端怎样入门?
- 企业如何选择企业网盘
- 手机壁纸-小程序背景壁纸