1. 云栖社区>
  2. PHP教程>
  3. 正文

Lumen配置文件按需加载出现的坑

作者:用户 来源:互联网 时间:2017-12-01 18:27:04

文件配置加载出现Lumen

Lumen配置文件按需加载出现的坑 - 摘要: 本文讲的是Lumen配置文件按需加载出现的坑,问题描述 公司一个高并发API需要从Laravel移植到Lumen,由于数据库配置信息是通过远程或者缓存读取后动态配置,所以在中间件时使用到了 Config::set然而实际运行时发现数据库配置并没有更新。 由于是从Larav

问题描述

公司一个高并发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 ,以便于您获取更多的相关知识。