ojezu/dynamic-parameter-bundle

Symfony3.4 扩展包,简化每个请求开始的动态参数加载

v2.0.0 2019-06-13 11:59 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",
      }
    }
  }
}

配置

多安装

为了能够使用多安装支持

  1. 在配置中启用它

    #app/config/config.yml
    
    ojezu_dynamic_parameter:
        multi_installation: true
  2. 将您的 AppKernel 更改为扩展 \OJezu\DynamicParameterBundle\Kernel\Kernel

    <?php
    
    use \OJezu\DynamicParameterBundle\Kernel\Kernel;
    
    class AppKernel extends Kernel
    {
        (...)
    }
  3. 确保在您的应用程序中创建内核的所有地方,都提供了 Installation 实例。内核通常由 web/*.phppublic/*.php 文件创建,但请记住修改您的 bin/console

    <?php
    (...)
    $installation = new Installation($requestedInstallation);
    $kernel = new AppKernel($installation, $env, $debug);

    完整的示例可以在本存储库的 doc/examples 目录中找到。

  4. 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