ojezu / dynamic-parameter-bundle
Symfony3.4 扩展包,简化每个请求开始的动态参数加载
Requires
- guzzlehttp/guzzle: ^6.3
- psr/simple-cache: ^1.0
- symfony/config: ^3.4
- symfony/dependency-injection: ^3.4
- symfony/expression-language: ^3.3
- symfony/http-kernel: ^3.4
Requires (Dev)
This package is auto-updated.
Last update: 2024-09-14 00:06:58 UTC
README
此扩展包允许在一个Symfony应用程序中拥有多个配置(安装)。它通过提供两个独立的功能来实现这一点:
- 安装感知内核,和安装依赖参数
- 高级参数提供者,可以从任何来源读取参数。
这两个功能的组合可以实现多租户应用程序,为每个租户在基础设施级别配置不同的资源。资源可以是数据库连接、文件系统适配器等。此外,配置存储可以卸载到数据库服务器、JSON文件、zookeeper实例,通过自定义或内置的参数提供者服务,它将根据应用程序内核中选择的安装加载适当的配置。
要求
此扩展包需要Symfony 3.4,因为它依赖于高级环境变量处理。
使用方法
注意:此扩展包的处理器 不 读取实际的环境变量。
多安装
向内核提供有关安装的信息(见以下配置),然后在您的配置中,您可以使用该信息作为参数。
#app/config/config.yml ojezu_dynamic_parameter: multi_installation: true file_storage: bucket: "/myapp/installation/%env(ojezu_installation:name)%/"
使用方法类似于普通环境变量,但提供了更多的控制,因为决定什么以及从何处找到其进入 Installation
对象的是开发者。安装参数可以根据请求头、php-cli参数和其他任何数据源设置,如使用此扩展包的应用程序中实现的那样(见以下配置)。
可以访问所有 Installation
类的公共属性,并且可以扩展 Installation 类,添加所需的属性。
高级参数提供者
在配置高级参数提供者(见以下配置)后,您可以将参数映射到用于从任何来源获取参数值的抽象配置路径,只要存在该来源的提供者。提供者是非常简单的服务,只需实现 ParameterProviderInterface
。JSON 本地文件和远程文件提供者已由此扩展包提供,比Symfony 内置的 "json:" 环境变量处理器更强大。
# app/config/config.yml ojezu_dynamic_parameter: advanced_parameters: provider: 'OJezu\DynamicParameterBundle\Service\LocalJsonFileParameterProvider' parameter_map: database_host: { path: ['database', 'host'] } doctrine: dbal: driver: pdo_mysql server_version: 5.7 host: "%env(ojezu_param:database_host)%"
# services.yml services: OJezu\DynamicParameterBundle\Service\LocalJsonFileParameterProvider: arguments: - '%kernel.root_dir%/config/config.json'
此配置将在JSON配置文件中查找 database.host 值,并将其提供给DBAL配置。
结合使用
虽然这两个功能都提供了比Symfony 3.4 内置的功能更多,但结合使用它们可以轻松管理同一Symfony应用程序支持的多个配置。
#app/config/config.yml ojezu_dynamic_parameter: multi_installation: true advanced_parameters: provider: 'OJezu\DynamicParameterBundle\Service\LocalJsonFileParameterProvider' parameter_map: database_name: { path: ['installation', '%env(ojezu_installation:name)%', 'database', 'name'] } doctrine: dbal: driver: pdo_mysql server_version: 5.7 host: "mysql.example.com" dbname: "%env(ojezu_param:database_name)%"
#services.yml services: OJezu\DynamicParameterBundle\Service\LocalJsonFileParameterProvider: arguments: - '%kernel.root_dir%/config/config.json'
{ "installation": { "application1": { "database": { "name": "app1_database", } }, "application2": { "database": { "name": "app2_database", } } } }
配置
多安装
为了能够使用多安装支持
-
在配置中启用它
#app/config/config.yml ojezu_dynamic_parameter: multi_installation: true
-
将您的 AppKernel 更改为扩展
\OJezu\DynamicParameterBundle\Kernel\Kernel
<?php use \OJezu\DynamicParameterBundle\Kernel\Kernel; class AppKernel extends Kernel { (...) }
-
确保在您的应用程序中创建内核的所有地方,都提供了
Installation
实例。内核通常由web/*.php
或public/*.php
文件创建,但请记住修改您的bin/console
。<?php (...) $installation = new Installation($requestedInstallation); $kernel = new AppKernel($installation, $env, $debug);
完整的示例可以在本存储库的
doc/examples
目录中找到。 -
在
bin/console
中,请确保还用此扩展包提供的Application
替换Application
,如果您想通过CLI选项指定安装,否则解析argv可能会引入问题。
完整的示例可以在 doc/examples
目录中找到。
高级参数提供者
您必须提供支持参数的映射。这是由于 %env(processor:variable)%
Symfony DI 容器配置语法中的限制,以及为了允许易于适应任何配置提供者的路径。
ojezu_dynamic_parameter: advanced_parameters: provider: 'OJezu\DynamicParameterBundle\Service\LocalJsonFileParameterProvider' parameter_map: database_host: { path: ['database', 'host'] } database_name: { path: ['database', 'name'] } database_user: { path: ['database', 'user'] }
这些参数可以在您的应用程序配置的所有地方使用,无论配置的包是否支持。
doctrine: dbal: driver: pdo_mysql server_version: 5.7 host: "%env(ojezu_param:database_host)%" dbname: "%env(ojezu_param:database_name)%" user: "%env(ojezu_param:database_user)%"
使用其他参数
在路径中可以使用所有之前加载的参数,包括 ojezu_installation
参数。
ojezu_dynamic_parameter: multi_installation: true advanced_parameters: provider: 'OJezu\DynamicParameterBundle\Service\LocalJsonFileParameterProvider' parameter_map: database_host: { path: ['installation', '%env(ojezu_installation:name)%', 'database', 'host'] } database_name: { path: ['installation', '%env(ojezu_installation:name)%', 'database', 'name'] } database_user: { path: ['installation', '%env(ojezu_installation:name)%', 'database', 'user'] }
参数提供者
内置参数提供者
LocalJsonFileParameterProvider
从本地磁盘打开并解析 JSON 文件。
# services.yml services: OJezu\DynamicParameterBundle\Service\LocalJsonFileParameterProvider: arguments: - '%kernel.root_dir%/etc/installation/%env(ojezu_installation:name)%.json'
# app/config/config.yml ojezu_dynamic_parameter: multi_installation: true advanced_parameters: provider: 'OJezu\DynamicParameterBundle\Service\LocalJsonFileParameterProvider'
RemoteJsonFileParameterProvider
使用 GuzzleHttp 客户端下载 JSON 文件,并且可选地在 PSR-16 Simple Cache 兼容的缓存中缓存它。
# services.yml services: app.guzzle.configuration: class: GuzzleHttp\Client arguments: - timeout: 5 auth: ['configuration', 'configuration'] app.cache.configuration: class: Symfony\Component\Cache\Simple\ApcuCache arguments: - 'installation_configuration' OJezu\DynamicParameterBundle\Service\RemoteJsonFileParameterProvider: arguments: - 'http://configuration_server/%env(ojezu_installation:name)%.json' - '@app.guzzle.configuration' - '@app.cache.configuration'
# app/config/config.yml ojezu_dynamic_parameter: multi_installation: true advanced_parameters: provider: 'OJezu\DynamicParameterBundle\Service\RemoteJsonFileParameterProvider'
自定义参数提供者
您可以使用任何实现了 OJezu\DynamicParameterBundle\Service\ParameterProviderInterface
接口的服务。
ojezu_dynamic_parameter: multi_installation: true advanced_parameters: provider: 'MyAppBundle\Services\RedisParameterProvider' # this is service! not class. parameter_map: database_host: { path: ['installation', '%env(ojezu_installation:name)%', 'database', 'host'] } database_name: { path: ['installation', '%env(ojezu_installation:name)%', 'database', 'name'] } database_user: { path: ['installation', '%env(ojezu_installation:name)%', 'database', 'user'] }
请注意,您的提供者是一个服务 - 它可以有它的参数注入,它可以被标记等。只要没有循环,它将像其他服务一样工作(不要尝试在其中注入 ojezu_param
!)
默认值?
是的。
ojezu_dynamic_parameter: advanced_parameters: provider: 'OJezu\DynamicParameterBundle\Service\LocalJsonFileParameterProvider' processor: database_host: path: ['database', 'host'] default: 'localhost'
无配置模式
在某些情况下,没有可加载的配置 - 例如在预热缓存时。对于这些情况,有“无配置模式”,在这种情况下,提供者将不会使用,并且所有变量都将解析为 null,除非为这些场景提供了显式值。 不会使用默认值。
通过在处理器部分使用 load_configuration
选项来启用它
ojezu_dynamic_parameter: multi_installation: true advanced_parameters: provider: 'OJezu\DynamicParameterBundle\Service\LocalJsonFileParameterProvider' load_configuration: '%env(bool:ojezu_installation:name)%' parameter_map: database_host: {path: ['installation', '%env(ojezu_installation:name)%', 'database', 'host']} log_channel: {path: ['log', '%env(ojezu_installation:name)%'], default: 'default', no_config_value: 'default'} bucket_name: {path: ['buckets', '%env(ojezu_installation:name)%'], no_config_value: '%env(LOCAL_BUCKET)%'}
在您的应用程序中扩展此捆绑包
扩展点包括
- 为 ojezu_installation 的
Installation
值对象 - 参数提供者
如果您需要从 Installation
获取更多选项,请使用附加的公共属性或方法扩展该类,并在原基类 Installation 的位置使用您的扩展类。
可以通过扩展 OJezu\DynamicParameterBundle\Service\ParameterProviderInterface
来编写新的提供者,并按照此 ReadMe 中的配置部分进行配置
测试
将是个不错的选择。
许可证
MIT