dwalczyk/setting-bundle

Symfony 扩展包,允许您轻松定义、读取和更改设置。

安装: 6

依赖者: 0

建议者: 0

安全性: 0

星星: 0

关注者: 1

分支: 0

开放问题: 0

类型:symfony-bundle

1.0.3 2024-02-26 23:57 UTC

This package is auto-updated.

Last update: 2024-09-27 01:21:56 UTC


README

设置包是 Symfony 框架的一个包,允许您轻松定义、读取和更改设置。

集成

  • symfony 缓存
  • doctrine orm
  • symfony profiler
  • symfony serializer
  • twig

目录

安装与配置

  1. 运行 composer require
composer require dwalczyk/setting-bundle
  1. 创建文件 config/dwalczyk_setting.yaml 并粘贴以下内容
dwalczyk_setting:

  data_storage: 'DWalczyk\SettingBundle\Extension\Doctrine\DataStorage\DoctrineDataStorage'
  #cache: cache.app

  #definitions: []
  1. 添加到 config/doctrine.yaml
doctrine:
    orm:
        mappings:
            SettingBundle:
                is_bundle: true
                dir: 'Resources/config/doctrine'
                prefix: 'DWalczyk\SettingBundle\Extension\Doctrine\Entity'
                alias: SettingBundle
  1. 创建并执行迁移
php bin/console doctrine:migrations:diff
php bin/console d:m:m

 

使用

  1. 首先我们需要定义设置。

通过 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
  1. 现在您可以全局或按用户读取或设置值。
#[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 函数支持的所有类型

默认情况下,数据转换器按以下顺序加载

  1. DoctrineDataTransformer
  2. 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) }}

 

Symfony profiler

Symfony profiler photo 1 Symfony profiler photo 2