harmony / settings-manager-bundle
提供了一种优雅的方式来定义变量并将它们注入到应用程序的部分
Requires
- php: >=7.1.3
- ext-json: *
- doctrine/collections: ^1.5
- myclabs/php-enum: ^1.5
- ocramius/proxy-manager: ^2.1
- symfony/config: ^3.4|^4.0
- symfony/console: ^3.4|^4.0
- symfony/dependency-injection: ^3.4|^4.0
- symfony/form: ^3.4|^4.0
- symfony/http-foundation: ^3.4|^4.0
- symfony/http-kernel: ^3.4|^4.0
- symfony/options-resolver: ^3.4|^4.0
- symfony/proxy-manager-bridge: ^3.4|^4.0
- symfony/serializer: ^3.4|^4.0
- symfony/validator: ^3.4|^4.0
- symfony/yaml: ^3.4|^4.0
Requires (Dev)
- aws/aws-sdk-php: ^3.48
- doctrine/doctrine-bundle: ^1.8
- doctrine/doctrine-fixtures-bundle: ^3.0
- doctrine/orm: ^2.6
- enqueue/enqueue: ^0.8.29
- friendsofphp/php-cs-fixer: ^2.11
- friendsofsymfony/jsrouting-bundle: ^2.1
- knplabs/knp-menu-bundle: ^2.2
- liip/functional-test-bundle: >=2.0.0-alpha1 <=2.0.0-alpha8
- paragonie/paseto: ^1.0
- phpunit/phpunit: ^6.5
- predis/predis: ^1.1
- symfony/asset: ^3.4|^4.0
- symfony/framework-bundle: ^3.4|^4.0
- symfony/monolog-bundle: ^3.1
- symfony/security-bundle: ^3.4|^4.0
- symfony/stopwatch: ^3.4|^4.0
- symfony/twig-bundle: ^3.4|^4.0
- symfony/web-profiler-bundle: ^3.4|^4.0
Suggests
- acelaya/doctrine-enum-type: Required if using doctrine orm, for persisting enum's
- aws/aws-sdk-php: Allows to use aws ssm setting provider
- doctrine/orm: Allows to use orm setting provider
- enqueue/enqueue: Allows to use consumption extension for warming up settings during messages
- friendsofsymfony/jsrouting-bundle: Required to fully use provided user interface
- knplabs/knp-menu-bundle: Required to fully use provided user interface
- paragonie/past: Allows to use cookie setting provider. php >=7.2 for better performance
- predis/predis: Allows to use decorating predis settings provider
- symfony/cache: Required by some settings providers
- symfony/monolog-bundle: Allows more advanced logging
This package is auto-updated.
Last update: 2020-06-30 17:36:43 UTC
README
提供了一种优雅的方式来定义变量并将它们注入到应用程序的部分。
- 支持
bool
、string
、int
、float
、array
作为设置值。 - 多个提供者。
- 用户界面。
跳转到
快速开始
-
composer require harmony/settings-manager-bundle
-
将捆绑包注册到
AppKernel.php
(Symfony3)或config/bundles.php
(Symfony4)
<?php class AppKernel extends Kernel { public function registerBundles() { return [ new Harmony\Bundle\SettingsManagerBundle\HarmonySettingsManagerBundle(), ]; } }
- 将示例配置添加到
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'
- 现在,获取服务中的设置的最简单方法是通过使用
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
,它添加了setEnabled
和isEnabled
方法。然后在您的服务上添加一个具有属性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
配置示例
- 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
- 创建设置实体
<?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; }
-
更新你的 doctrine 架构。
-
注册设置提供者
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
此提供者用于缓存其他设置提供者,如DoctrineORM或AWS 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'
用户界面
用户界面可用于更改设置值、启用或禁用域。
-
捆绑的用户界面需要knp-menu-bundle、jsrouting-bundle。
composer require knplabs/knp-menu-bundle friendsofsymfony/jsrouting-bundle
-
包含路由文件。
# 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分支创建新功能分支。