首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony 4.取消注册ObjectNormalizer

Symfony 4.取消注册ObjectNormalizer
EN

Stack Overflow用户
提问于 2018-05-04 23:30:53
回答 2查看 1.2K关注 0票数 1

我希望我的序列化过程是显式的,不使用对象/属性规格化程序,我如何注销它们?

http://symfony.com/doc/current/components/serializer.html#normalizers

EN

回答 2

Stack Overflow用户

发布于 2018-05-04 23:40:18

我找到了一种在Kernel::build中添加编译器通道的方法

代码语言:javascript
复制
class Kernel extends BaseKernel
{
    // ...

    protected function build(ContainerBuilder $container)
    {
        $container->addCompilerPass(new class implements CompilerPassInterface
        {
            public function process(ContainerBuilder $container)
            {
                $container->removeDefinition('serializer.normalizer.json_serializable');
                $container->removeDefinition('serializer.normalizer.object');
            }
        }, PassConfig::TYPE_BEFORE_OPTIMIZATION, 1);
    }
}

优先级=1使其在SerializerPass之前运行,因此它可以工作。

更新:@Nek的建议是在framework配置中禁用序列化程序,然后自己注册它似乎是一个好主意。

票数 0
EN

Stack Overflow用户

发布于 2018-05-05 00:15:11

如果您希望您的序列化过程是显式的,您可以在服务definition中注册您自己的规范器,如下所示

代码语言:javascript
复制
AppBundle\Serializer\Your\MyObjectNormalizer:
    tags:
        - { name: serializer.normalizer }

您可以像下面这样声明一个规范化程序

代码语言:javascript
复制
namespace AppBundle\Serializer\Your; 
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;

class MyObjectNormalizer implements NormalizerInterface
    {
    public function normalize($object, $format = null, array $context = [])
    {
        // $object is an instance of MyObject
        $groups = array_key_exists('groups', $context) ? $context['groups'] : [];

        $data = [
            'name' => $object->getName()
            // ..........
        ];
        if(array_key_exists('full', $groups)) {
            $data['owner'] = $object->getOwner()->getFullName();
        }
        return $data;
    }

    /**
     * Checks whether the given class is supported for normalization by this normalizer.
     *
     * @param mixed  $data   Data to normalize
     * @param string $format The format being (de-)serialized from or into
     *
     * @return bool
     */
    public function supportsNormalization($data, $format = null)
    {
        return $data instanceof MyObject;
    }
}

如果你像这样处理,Symfony会看到你为这类对象声明了一个自定义的规格化器。所以他会把你的课放在第一位让MyObject正常化

您可以标准化上下文数组中的数据

代码语言:javascript
复制
$myobject = new MyObject();

$fullObj = $this->container->get('serializer')->serialize($myobject, 'json', ['full']);

$lightObj = $this->container->get('serializer')->serialize($myobject, 'json');
// $fullObj is ['name' => 'someName', 'owner' => 'ownerName'];
// $lightObj is ['name' => 'someName'];

看一下documentation的这一部分

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50178432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档