bluepsyduck/jms-serializer-factory

一个通过配置初始化 JMS 序列化器的 Laminas 工厂。

1.1.0 2021-12-14 17:43 UTC

This package is auto-updated.

Last update: 2024-09-15 00:05:16 UTC


README

GitHub release GitHub build Codecov

此库提供了一个与 Laminas 兼容的工厂,用于从配置中创建 JMS 序列化器 实例,无需实际编写工厂。

用法

使用 composer 安装包:

composer require bluepsyduck/jms-serializer-factory

第一步是将设置添加到您的 Laminas 配置中。使用 ConfigKey 接口获取配置选项的名称。完整的选项列表如下。

<?php
// config/serializers.php

use BluePsyduck\JmsSerializerFactory\Constant\ConfigKey;
use JMS\Serializer\Naming\IdenticalPropertyNamingStrategy;

return [
    'serializers' => [
        'my-fancy-serializer' => [
            ConfigKey::PROPERTY_NAMING_STRATEGY => IdenticalPropertyNamingStrategy::class,
            ConfigKey::HANDLERS => [
                MyFancyHandler::class,
            ],
            ConfigKey::METADATA_DIRS => [
                'My\Fancy\Namespace' => __DIR__ . '/../serializer',
            ],
            ConfigKey::CACHE_DIR => __DIR__ . '/../../data/cache',
        ],
    ],
];

JMS 序列化器工厂将从容器中请求任何依赖项,因此请确保注册所有依赖项。如果它们没有自己的依赖项,请使用 InvokableFactory 注册它们。

<?php
// config/dependencies.php

use BluePsyduck\JmsSerializerFactory\JmsSerializerFactory;
use Laminas\ServiceManager\Factory\InvokableFactory;
use JMS\Serializer\Naming\IdenticalPropertyNamingStrategy;

return [
    'dependencies' => [
        'factories' => [
            // Add the services used in the serializer config to the container.
            IdenticalPropertyNamingStrategy::class => InvokableFactory::class,
            MyFancyHandler::class => InvokableFactory::class,
            
            // Add the actual serializer instance to the container.
            'MyFancySerializer' => new JmsSerializerFactory('serializers', 'my-fancy-serializer'),
            // This will take the config for the serializer from $config['serializers']['my-fancy-serializer']
        ],
    ],
];

使用此配置,您现在可以从容器中获取序列化器实例

<?php

/* @var \JMS\Serializer\SerializerInterface $myFancySerializer */
$myFancySerializer = $container->get('MyFancySerializer');

// Use it as usual.
$json = $myFancySerializer->serialize($data, 'json');

或者,如果已设置 Laminas AutoWire Factory,则可以使用属性 UseJmsSerializer 将构造函数的参数解析为序列化器的配置

use BluePsyduck\JmsSerializerFactory\Attribute\UseJmsSerializer;
use JMS\Serializer\SerializerInterface;

class MyFancyClass {
    public function __construct(
        #[UseJmsSerializer('serializers', 'my-fancy-serializer')] // The keys to the configuration of the serializer.
        private SerializerInterface $serializer,
    ) {
    }
}

所有配置选项

以下表格显示了工厂支持的完整配置值列表。常量 指的是 ConfigKey 接口中的常量名称,而 SerializerBuilder 方法 列指的是用于该配置值的构建器方法。有关更多详细信息,请检查构建器的函数签名和文档注释。

注意
  • 期望的值 容器别名 意味着预期一个字符串,该字符串用于容器以检索实际实例并将其设置到序列化器构建器中。所需实例的实际类型可以在 SerializerBuilder 的相关方法中检查。
  • 序列化和反序列化访问者将与它们的格式字符串一起添加到构建器中。配置期望格式作为键,访问者工厂的别名作为值。
  • METADATA_DIRS 期望数组键是命名空间,值是元配置文件所在的目录。
  • 工厂仅支持实现 SubscribingHandlerInterface 的类作为处理程序,以及实现 EventSubscriberInterface 的类作为监听器。无法使用可调用对象处理这两种情况。