tsantos / fast-object-normalizer
为您的对象生成专用规范化器以提高序列化性能
Requires
- php: >8.1
- phpdocumentor/reflection-docblock: ^5.3
- symfony/property-info: ^6.1
- symfony/serializer: ^6.1
- twig/twig: ^3.4
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.10
- phpbench/phpbench: ^1.2
- phpunit/phpunit: ^9.5
- symfony/cache: ^6.1
- symfony/property-access: ^6.1
This package is auto-updated.
Last update: 2024-09-29 06:14:53 UTC
README
Symfony Object Normalizer 用于改进序列化过程,与内置规范化器相比,性能提升最多 5 倍(例如,400%)。这种性能提升可以通过为您的数据类生成专用规范化器来实现,因此您无需担心运行时开销,如反射或依赖于元数据(例如,ClassMetadata)的代码。
安装
composer require tsantos/fast-object-normalizer
Symfony 应用程序
此包附带一个 Symfony Bundle,可自动将规范化器添加到规范化器堆栈中。
使用 Flex 的应用程序
只需安装包,Symfony Flex 将自动将包注册到您的应用程序中。
不使用 Flex 的应用程序
您需要手动注册包
<?php // config/bundles.php return [ // .. TSantos\FastObjectNormalizer\Bridge\Symfony\FastObjectNormalizerBundle::class => ['all' => true] ];
独立应用程序
对于使用 Symfony Serializer 作为独立组件的应用程序,您需要手动注册规范化器
<?php require 'vendor/autoload.php'; use Symfony\Component\Serializer\Mapping\ClassDiscriminatorFromClassMetadata; use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory; use Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader; use Symfony\Component\Serializer\Normalizer\ArrayDenormalizer; use Symfony\Component\Serializer\Normalizer\ObjectDenormalizer; $classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())); $discriminator = new ClassDiscriminatorFromClassMetadata($classMetadataFactory); $serializer = new Serializer([ new ArrayDenormalizer(), new FastObjectNormalizer( classGenerator: new NormalizerClassGenerator($classMetadataFactory, $discriminator), classDumper: new NormalizerClassDumper('./var/cache/serializer'), classMetadataFactory: $classMetadataFactory, ), new ObjectNormalizer($classMetadataFactory) ], ['json' => new JsonEncoder()]);
注意,ObjectNormalizer
仍在规范化器堆栈中。这不是强制性的,但最好让内置规范化器工作,因为 Fast Object Normalizer
可能不支持正在序列化的对象。
配置
Fast Object Normalizer
致力于序列化数据类(例如:DTO),但在某些情况下,您的应用程序可能尝试序列化包含资源或连接的对象,并且通常有一个专用的规范化器来处理该类型。为确保 Fast Object Normalizer
跳过此类类型,您可以将它配置为仅序列化与某些模式匹配的类型。
<?php $normalizer = new FastObjectNormalizer( includedTypes: ['^App\\\Entity'] //... other args here )
# config/packages/fast_object_normalizer.yaml fast_object_normalizer: includedTypes: ["^App\\Entity"]
使用 includedTypes
配置规范化器,您可以确切知道规范化器将支持哪些类型。在大多数情况下,您将选择此配置以避免异常行为。
还有 includedTypes
的对立面,它现在将接受所有类型,除非在 excludedList
中定义的类型。
<?php $normalizer = new FastObjectNormalizer( includedTypes: ['^App\\\Entity'] //... other args here )
# config/packages/fast_object_normalizer.yaml fast_object_normalizer: excludedTypes: ["^Some\\Vendor\\Object"]
最后,您可以结合这两种选项
<?php $normalizer = new FastObjectNormalizer( includedTypes: ['^App\\\Entity'], excludedTypes: ['^App\\\Entity\\\\ExcludedType'], //... other args here )
# config/packages/fast_object_normalizer.yaml fast_object_normalizer: excludedTypes: ['^App\\\Entity'] includedTypes: ["^App\\\Entity\\\\ExcludedType"]
使用此配置,您允许所有以 App\Entity
开头的类型,但排除 App\Entity\ExcludedType
。
请注意
此包力求尽可能透明,以便您可以在不破坏应用程序的情况下使用它。如前所述,此包创建专用规范化器以尽可能快地序列化您的数据,这意味着内置规范化器 AbstractObjectNormalizer
将无法访问。这意味着功能如属性分组、跳过空值、属性回调等必须在此处重新实现以提升性能,也就是说,可能 与 AbstractObjectNormalizer
有一些不同的行为。如果您发现一些不同的行为,请提交一个问题。
下表列出了当前内置规范化器和 Fast Object Normalizer
支持的所有功能。
如果您想使用 Fast Object Normalizer
但需要实现特定功能,我会很高兴为您指出如何实现它。