harmony/settings-manager-bundle

此包已被弃用且不再维护。没有建议的替代包。

提供了一种优雅的方式来定义变量并将它们注入到应用程序的部分

安装: 75

依赖: 1

建议者: 0

安全: 0

星标: 0

关注者: 1

分支: 0

公开问题: 2

类型:symfony-bundle

0.1 2019-04-25 19:03 UTC

This package is auto-updated.

Last update: 2020-06-30 17:36:43 UTC


README

提供了一种优雅的方式来定义变量并将它们注入到应用程序的部分。

  • 支持boolstringintfloatarray作为设置值。
  • 多个提供者。
  • 用户界面。

跳转到

快速开始

  1. composer require harmony/settings-manager-bundle

  2. 将捆绑包注册到AppKernel.php(Symfony3)或config/bundles.php(Symfony4)

<?php

class AppKernel extends Kernel
{
    public function registerBundles()
    {
        return [
            new Harmony\Bundle\SettingsManagerBundle\HarmonySettingsManagerBundle(),
        ];
    }
}
  1. 将示例配置添加到app/config/config.yml(Symfony3)或config/packages/settings_manager.yaml(Symfony4)
harmony_settings_manager:
    settings:
        - name: foo
          description: 'foo desc'
          type: bool
          data: false
          tags:
              - 'super_switch'

        - name: baz
          description: 'master toggle for awesome new feature'
          type: string
          data: fish
          tags:
              - 'experimental'
              - 'poo'
  1. 现在,获取服务中的设置的最简单方法是通过使用SettingsRouterAwareTrait。服务将通过自动装配自动注入。然后只需请求设置
use Harmony\Bundle\SettingsManagerBundle\Settings\Traits\SettingsRouterAwareTrait;

class MuchAmazingService
{
    use SettingsRouterAwareTrait;

    public function doSmth()
    {
        if ($this->settingsRouter->getBool('foo')) {
            // do it
        }

        // just do it
    }
}

用法

要将设置添加到您的服务中,您有几个选择

SettingsRouter

SettingsRouter非常简单。它有一个主要方法,名为$settingsRouter->get($settingName, $default = null),返回任何类型的设置。如果设置缺失,将返回默认值。其他getters是get的别名,具有声明返回类型和适当的默认值。

方法名称 默认值 声明返回类型
getString '' string
getBool false bool
getInt 0 int
getFloat 0.0 float
getArray [] array

服务标签

如果您不想注入SettingsRouter或希望服务更简洁,服务标签将有所帮助。首先,服务必须有一个设置器,可以用于注入设置值。对于布尔值,该捆绑包提供了SwitchableTrait,它添加了setEnabledisEnabled方法。然后在您的服务上添加一个具有属性setting(设置名称)和method(方法名称)的标签。示例

AppBundle\Service\AmazingService:
    tags:
        - { name: settings_manager.setting_aware, setting: foo, method: setEnabled }

模型

Harmony\Bundle\SettingsManagerBundle\Model\SettingModel

基本设置模型。

属性 类型 描述
$name string 设置名称
$description string 设置描述
$domain DomainModel 域模型
$tags Collection[Tag] 标签集合
$type Enum[Type] 确定设置值类型
$data array 保留设置的实际值
$providerName string 内部字段,用于了解此设置来自哪个提供者

Harmony\Bundle\SettingsManagerBundle\Model\DomainModel

域类似于设置组。没有域设置无法存在。默认名为 default,始终启用。域只能包含一个具有相同名称的设置。具有相同名称的设置必须在不同的域中。当请求设置时,将返回优先级较高的域中的设置。

属性 类型 描述
$name string 域名
$priority int (默认: 0) 域优先级
$enabled bool (默认: false) 域启用指示
$readOnly bool (默认: false) 域只读指示

Harmony\Bundle\SettingsManagerBundle\Model\Type

枚举,包含设置支持的类型。值

  • STRING
  • BOOL
  • INT
  • FLOAT
  • YAML
  • CHOICE

设置提供者

设置可以来自多个来源。目前,该捆绑包包含 4 个设置提供者。它们可以进行配置和排序。如果相同名称的设置来自 >1 个提供者,则优先级较高的提供者中的设置将覆盖优先级较低的提供者中的设置。

可以使用 用户界面轻松地在提供者中修改设置。

设置提供者

以及另外 2 个装饰提供者

简单设置提供者

Harmony\Bundle\SettingsManagerBundle\Provider\SimpleSettingsProvider

这是一个仅包含设置集合的提供者。目前,它被用来保存来自配置的设置,但还可以配置更多。

要配置额外的简单提供者,因为提供者只能接受已经反规范化对象,所以提供了一个工厂。

配置示例

setting_provider_factory.foo:
    class: Harmony\Bundle\SettingsManagerBundle\Provider\Factory\SimpleSettingsProviderFactory
    arguments:
        $serializer: '@settings_manager.serializer'
        $normalizedData:
            -
                - name: foo
                  description: 'foo desc'
                  type: bool
                  domain: { name: default } 
                  data: { value: false }
                  tags: [{ name: 'super_switch' }]
    tags:
        - { name: settings_manager.provider_factory, provider: foo, priority: 10 }

DoctrineORM 设置提供者

Harmony\Bundle\SettingsManagerBundle\Provider\DoctrineOrmSettingsProvider

这是一个使用 EntityManagerInterface 读取和保存设置的提供者。

所需库

我猜你已经有它了 😮
composer require doctrine/orm acelaya/doctrine-enum-type

配置示例

  1. Doctrine 配置
# Symfony3, app/config/config.yml
# Symfony4, config/packages/doctrine.yaml
doctrine:
    orm:
        mappings:
            HarmonySettingsManagerBundle:
                type: yml
                is_bundle: true
                dir: "Resources/config/doctrine"
                alias: HarmonySettingsManagerBundle
                prefix: Harmony\Bundle\SettingsManagerBundle
  1. 创建设置实体
<?php
declare(strict_types=1);

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Harmony\Bundle\SettingsManagerBundle\Model\SettingModel;

/**
 * @ORM\Entity()
 * @ORM\Table(name="setting")
 */
class Setting extends SettingModel
{
    /**
     * @var int
     *
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    protected $id;
}
  1. 更新你的 doctrine 架构。

  2. 注册设置提供者

Harmony\Bundle\SettingsManagerBundle\Provider\DoctrineOrmSettingsProvider:
    arguments:
        $entityManager: '@doctrine.orm.default_entity_manager'
        $settingsEntityClass: 'App\Entity\Setting'
    tags:
        - { name: settings_manager.provider, provider: orm, priority: 20 }

Cookie 设置提供者

Harmony\Bundle\SettingsManagerBundle\Provider\CookieSettingsProvider

这是一个仅通过 cookie 启用现有设置的提供者。Cookies 被编码,这样用户就不能随机启用它们。

所需库

composer require paragonie/paseto

Paseto 用于加密 cookies。

配置示例

Harmony\Bundle\SettingsManagerBundle\Provider\CookieSettingsProvider:
    arguments:
        $serializer: '@settings_manager.serializer'
    tags:
        - { name: settings_manager.provider, provider: cookie, priority: 30 }
        - { name: kernel.event_subscriber }

非对称 Cookie 设置提供者

Harmony\Bundle\SettingsManagerBundle\Provider\AsymmetricCookieSettingsProvider

这是一个仅通过 cookie 启用现有设置的提供者。Cookies 使用非对称私钥和公钥进行编码,这样用户就不能随机启用它们。

所需库

composer require paragonie/paseto

Paseto 用于加密 cookies。

配置示例

Harmony\Bundle\SettingsManagerBundle\Provider\AsymmetricCookieSettingsProvider:
    arguments:
        $serializer: '@settings_manager.serializer'
    tags:
        - { name: settings_manager.provider, provider: asymmetric_cookie, priority: 40 }
        - { name: kernel.event_subscriber }

AWS SSM 设置提供者

Harmony\Bundle\SettingsManagerBundle\Provider\AwsSsmSettingsProvider

这是一个提供者,仅用于读取和更新现有ssm参数作为设置。

所需库

composer require aws/aws-sdk-php

配置示例

Harmony\Bundle\SettingsManagerBundle\Provider\AwsSsmSettingsProvider:
    arguments:
        - '@Aws\Ssm\SsmClient'
        - '@settings_manager.serializer'
        - ['amazing_parameter_name']
    tags:
        - { name: settings_manager.provider, provider: aws_ssm }

Phpredis装饰设置提供者

Harmony\Bundle\SettingsManagerBundle\Provider\DecoratingRedisSettingsProvider

此提供者用于缓存其他设置提供者,如DoctrineORMAWS SSM。它使用Redis客户端,而不是doctrine/cache提供者symfony/cache适配器,因为我们想利用Redis数据结构简化无效化过程。

所需扩展

pecl install redis-3.1.6

配置示例

Harmony\Bundle\SettingsManagerBundle\Provider\DecoratingRedisSettingsProvider:
    decorates: 'Harmony\Bundle\SettingsManagerBundle\Provider\DoctrineOrmSettingsProvider'
    arguments:
        $decoratingProvider: 'Harmony\Bundle\SettingsManagerBundle\Provider\DecoratingRedisSettingsProvider.inner'
        $redis: '@settings.cache.redis' # you need to register your own \Redis client in container
        $serializer: '@settings_manager.serializer'

Predis装饰设置提供者

Harmony\Bundle\SettingsManagerBundle\Provider\DecoratingPredisSettingsProvider

phpredis装饰设置提供者相同。它只是将phpredis扩展替换为predis

所需库

composer require predis/predis

配置参考

harmony_settings_manager:
    settings:
        -
            name: foo
            description: 'foo desc'
            domain: default # Used for grouping settings.
            type: bool
            data: false
            tags: [super_switch]
    profiler:
        enabled: false
    logger:
        enabled: false
        service_id: null # Psr\Log\LoggerInterface service id
    settings_files:
        # - '%kernel.root_dir%/config/extra_settings.yml'

用户界面

用户界面可用于更改设置值、启用或禁用域。

  1. 捆绑的用户界面需要knp-menu-bundlejsrouting-bundle

    composer require knplabs/knp-menu-bundle friendsofsymfony/jsrouting-bundle

  2. 包含路由文件。

# Symfony3, app/config/routing.yml 
# Symfony4, config/routes/settings_manager.yaml

settings_manager:
    resource: '@HarmonySettingsManagerBundle/Resources/config/routing.yml'
    prefix: /settings

这就完了。现在转到/settings路径,您将看到设置用户界面。

Twig

也添加了Twig扩展,以便在twig模板中获取设置。就像在SettingsRouter中一样,第一个参数是设置名称,第二个设置默认值。

{{ setting_get('foo', false) }}

控制器

Harmony\Bundle\SettingsManagerBundle\Controller\Traits\SettingsControllerTrait

添加了一个方法来拒绝访问,除非设置被启用。它使用SettingsRouter,再次,它将通过自动注入

public function indexAction(): Response
{
    $this->denyUnlessEnabled('index_page');
    ...
}

贡献

应从master分支创建新功能分支。