ConfigProvider 机制
什么是 ConfigProvider 机制 ?
简单来说,就是每个组件都会提供一个 ConfigProvider
,通常是在组件的根目录提供一个 ConfigProvider
的类,ConfigProvider
会提供对应组件的所有配置信息,这些信息都会被 Hyperf 框架在启动时加载,最终ConfigProvider
内的配置信息会被合并到 Hyperf\Contract\ConfigInterface
对应的实现类去,从而实现各个组件在 Hyperf 框架下使用时要进行的配置初始化。
如何定义一个 ConfigProvider ?
通常来说,ConfigProvider
会定义在组件的根目录下,一个 ConfigProvider
类通常如下:
{
"require": {
"php": ">=7.2"
"autoload": {
"psr-4": {
"Hyperf\\Foo\\": "src/"
}
},
"extra": {
"hyperf": {
"config": "Hyperf\\Foo\\ConfigProvider"
}
}
定义了之后需执行 composer install
或 composer update
或 等会让 Composer 重新生成 composer.lock
文件的命令,才能被正常读取。
ConfigProvider 机制的执行流程
组件设计规范
由于 composer.json
内的 extra
属性在数据不被利用时无其它作用和影响,故这些组件内的定义在其它框架使用时,不会造成任何的干扰和影响,顾 ConfigProvider
是一种仅作用于 Hyperf 框架的机制,对其它没有利用此机制的框架不会造成任何的影响,这也就为组件的复用打下了基础,但这也要求在进行组件设计时,必须遵循以下规范:
- 所有类的设计都必须允许通过标准
OOP
的使用方式来使用,所有 Hyperf 专有的功能必须作为增强功能并以单独的类来提供,也就意味着在非 Hyperf 框架下仍能通过标准的手段来实现组件的使用; - 组件的依赖设计如果可满足 PSR 标准 则优先满足且依赖对应的接口而不是实现类;如 没有包含的功能,则可满足由 Hyperf 定义的契约库 Hyperf/contract 内的接口时优先满足且依赖对应的接口而不是实现类;
- 对于实现 Hyperf 专有功能所增加的增强功能类,通常来说也会对 Hyperf 的一些组件有依赖,那么这些组件的依赖不应该写在
composer.json
的require
项,而是写在suggust
项作为建议项存在; - 组件设计时不应该通过注解进行任何的依赖注入,注入方式应只使用
构造函数注入
的方式,这样同时也能满足在OOP
下的使用; - 组件设计时不应该通过注解进行任何的功能定义,功能定义应只通过
ConfigProvider
来定义; - 类的设计时应尽可能的不储存状态数据,因为这会导致这个类不能作为长生命周期的对象来提供,也无法很方便的使用依赖注入功能,这样会在一定程度下降低性能,状态数据应都通过
Hyperf\Utils\Context
协程上下文来储存;