dwalczyk / setting-bundle
Symfony 扩展包,允许您轻松定义、读取和更改设置。
1.0.3
2024-02-26 23:57 UTC
Requires
- php: ^8.2
- doctrine/orm: ^2.11
- symfony/cache: ^6.0|^7.0
- symfony/framework-bundle: ^6.0|^7.0
- symfony/property-access: ^6.0|^7.0
- symfony/serializer: ^6.0|^7.0
- symfony/stopwatch: ^6.0|^7.0
- twig/twig: ^3.0
- webmozart/assert: ^1.11
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.13
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^10.5
- spaze/phpstan-disallowed-calls: ^3.1
README
设置包是 Symfony 框架的一个包,允许您轻松定义、读取和更改设置。
集成
- symfony 缓存
- doctrine orm
- symfony profiler
- symfony serializer
- twig
目录
安装与配置
- 运行 composer require
composer require dwalczyk/setting-bundle
- 创建文件
config/dwalczyk_setting.yaml
并粘贴以下内容
dwalczyk_setting: data_storage: 'DWalczyk\SettingBundle\Extension\Doctrine\DataStorage\DoctrineDataStorage' #cache: cache.app #definitions: []
- 添加到
config/doctrine.yaml
doctrine: orm: mappings: SettingBundle: is_bundle: true dir: 'Resources/config/doctrine' prefix: 'DWalczyk\SettingBundle\Extension\Doctrine\Entity' alias: SettingBundle
- 创建并执行迁移
php bin/console doctrine:migrations:diff php bin/console d:m:m
使用
- 首先我们需要定义设置。
通过 PHP
<?php declare(strict_types=1); namespace App; use DWalczyk\SettingBundle\AbstractSettingExtension; use DWalczyk\SettingBundle\SettingDefinition; final class SettingExtension extends AbstractSettingExtension { public function getDefinitions(): array { return [ new SettingDefinition(name: 'black_mode', type: 'bool', defaultValue: false), ]; } }
或通过 YAML 配置
dwalczyk_setting: definitions: black_mode: type: bool default_value: false
- 现在您可以全局或按用户读取或设置值。
#[Route('/')] public function test(SettingsInterface $settings): Response { $settings->get('black_mode'); // false $settings->get('black_mode', 'John'); // false // set "global scope" value $settings->set('black_mode', true); $settings->get('black_mode'); // true $settings->get('black_mode', 'John'); // true // set "user scope" value $settings->set('black_mode', false, 'John'); $settings->get('black_mode'); // true $settings->get('black_mode', 'John'); // false // ... }
数据存储
数据存储是负责写入和读取先前保存设置的类。
可用的内置数据存储
DWalczyk\SettingBundle\Extension\Doctrine\DataStorage\DoctrineDataStorage
- Doctrine ORM 存储
您可以创建自己的数据存储,只需创建一个实现 DWalczyk\SettingBundle\DataStorageInterface
的 symfony 服务,并将其名称插入配置中。
namespace App\DataStorage; use DWalczyk\SettingBundle\DataStorageInterface; class Custom implements DataStorageInterface { public function read(string $name, ?string $ownerIdentifier): ?string { // TODO: Implement read() method. } public function write(string $name, ?string $value, ?string $ownerIdentifier): void { // TODO: Implement write() method. } }
dwalczyk_setting: data_storage: 'App\DataStorage\Custom'
数据转换器
数据转换器确定在写入数据存储之前和之后如何格式化数据。
它们还负责格式化 "defaultValue" 定义中的值。
内置数据转换器
DoctrineDataTransformer
- 处理 doctrine 类型,了解更多SerializerDataTransformer
- 处理 symfony serializer 支持的所有类型NativePhpSerializerDataTransformer
- 处理 serialize/unserialize 原生 PHP 函数支持的所有类型
默认情况下,数据转换器按以下顺序加载
DoctrineDataTransformer
SerializerDataTransformer
如果您想使用 NativePhpSerializerDataTransformer
而不是 SerializerDataTransformer
,请将以下代码添加到您的配置中
services: DWalczyk\SettingBundle\Extension\Core\DataTransformer\NativePhpSerializerDataTransformer: tags: - { name: 'dwalczyk_setting.data_transformer', priority: 1 }
或创建自定义数据转换器
<?php namespace App; use DWalczyk\SettingBundle\DataTransformerInterface; use Symfony\Component\DependencyInjection\Attribute\AsTaggedItem; #[AsTaggedItem('dwalczyk_setting.data_transformer', priority: 2)] class CustomDataTransformer implements DataTransformerInterface { // implement required methods }
DoctrineDataTransformer
支持类型
doctrine-entity<fqcn/of/entity>
- 单个实体,例如doctrine-entity<App\Mail\Entity\MailTemplate>
doctrine-entity<fqcn/of/entity>[]
- 多个实体,例如doctrine-entity<App\Mail\Entity\MailTemplate>[]
缓存
要使用缓存,您必须在 symfony 配置中配置缓存,然后在包配置中定义 cache
选项。
framework: cache: app: cache.adapter.filesystem
dwalczyk_setting: cache: cache.app
或使用自定义池
framework: cache: pools: setting_pool: adapter: cache.adapter.filesystem
dwalczyk_setting: cache: setting_pool
如果您不想使用缓存,请将 cache
选项留空或未定义。
更有效的用户(设置所有者)传递
在您的安全用户类中实现 SettingOwnerInterface
。
class User implements UserInterface, PasswordAuthenticatedUserInterface, SettingOwnerInterface { public function getSettingIdentifier(): string { return (string) $this->id; } ... }
现在您可以调用
#[Route('/')] public function test(SettingsInterface $settings): Response { $settings->get('black_mode', $this->getUser()); // or $settings->set('black_mode', true, $this->getUser()); // ... }
Twig
函数
{{ setting(settingName) }}