Symfony 4如何注销ObjectNormalizer?实现无对象/属性规范化器的显式序列化
在Symfony 4中手动注销ObjectNormalizer和PropertyNormalizer
如果你想完全掌控序列化过程,彻底禁用默认的ObjectNormalizer和PropertyNormalizer,有两种靠谱的方法可以实现,我分别给你详细说下:
方法一:通过配置文件直接排除
在Symfony 4中,你可以通过serializer配置文件直接移除这两个规范化器。打开config/packages/serializer.yaml(如果没有就新建一个),添加以下配置:
framework: serializer: enabled: true # 只保留你需要的规范化器,比如自定义的,不要列ObjectNormalizer和PropertyNormalizer normalizers: - App\Serializer\YourCustomNormalizer # 或者直接排除默认服务 exclude: - Symfony\Component\Serializer\Normalizer\ObjectNormalizer - Symfony\Component\Serializer\Normalizer\PropertyNormalizer
这种方式简单直接,适合大多数场景,配置后Symfony就不会再加载这两个默认规范化器了。
方法二:使用编译器通行证(Compiler Pass)
如果你的需求更复杂,比如需要动态判断是否注销,或者在Bundle里处理,可以通过编译器通行证来移除这两个服务。
首先创建一个CompilerPass类:
// src/DependencyInjection/Compiler/RemoveDefaultNormalizersPass.php namespace App\DependencyInjection\Compiler; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; class RemoveDefaultNormalizersPass implements CompilerPassInterface { public function process(ContainerBuilder $container) { // 移除ObjectNormalizer服务 if ($container->hasDefinition('serializer.normalizer.object')) { $container->removeDefinition('serializer.normalizer.object'); } // 移除PropertyNormalizer服务 if ($container->hasDefinition('serializer.normalizer.property')) { $container->removeDefinition('serializer.normalizer.property'); } } }
然后在你的Kernel类里注册这个编译器通行证:
// src/Kernel.php namespace App; use App\DependencyInjection\Compiler\RemoveDefaultNormalizersPass; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\Kernel as BaseKernel; class Kernel extends BaseKernel { // ...其他方法 protected function build(ContainerBuilder $container) { parent::build($container); $container->addCompilerPass(new RemoveDefaultNormalizersPass()); } }
注意事项
注销这两个默认规范化器后,一定要确保你已经注册了自己的自定义规范化器,否则在执行序列化/反序列化操作时会抛出异常,因为Symfony找不到合适的规范化器来处理你的对象。
内容的提问来源于stack exchange,提问作者You Care
相关产品推荐
相关产品推荐

