如何将Symfony序列化器正确注入控制器?

时间:2019-02-20 20:31:04

标签: symfony dependency-injection serializer

我将Symfony序列化器注入控制器时遇到问题。 这是我要达到的行为的有效示例:

public function someAction(): Response
{
    $goodViews = //here I get an array of Value Objects or DTO's ;

    $serializer = new Serializer([new ObjectNormalizer()], [new JsonEncoder()]);

    // normalize gives me a proper array for serialization
    return $this->json(
         $serializer->normalize($goodViews)
    );
}

但是现在我需要通过对控制器构造函数或操作进行依赖注入来更改直接创建序列化器的过程。我认为,另一种方式是创建将ObjectNormalizer和JsonEncoder作为参数的服务,然后创建一个Serializer,然后以特殊方法对对象数组进行规范化并返回结果。但是我不知道如何在service.yml中创建序列化程序或正确描述服务依赖项。 Symfony文档还可以像我在代码示例中一样获得简单的序列化程序服务或手动创建它。

我想在动作中从服务容器中获取序列化器服务(使用$ this-> get('serializer'))或通过NormalizerInterface将其注入到控制器构造函数中(我主要需要标准化对象数组),但是此注入的序列化程序因此类错误而掉落:

  

“ message”:“无法规范化属性\” options \“,因为   注入的序列化程序不是规范化程序”,“类”:   “ Symfony \ Component \ Serializer \ Exception \ LogicException”,

所以我想,它的配置方式与我手动创建序列化程序的方式不同。

我们的Symfony版本是3.4感谢您的关注。

2 个答案:

答案 0 :(得分:0)

我的问题的决定有些棘手。 ObjectNormalizer被自定义规范器覆盖(自定义服务定义中的 decorate 部分-参见https://symfony.com/doc/3.4/service_container/service_decoration.html)。这就是为什么在框架中预先配置的Symfony序列化程序中,我得到了一个自定义的错误代码:

  

由于插入的序列化程序,无法规范属性\“ options \”   不是规范化器

所以我用ObjectNormalizer创建了一个新的序列化器服务:

new_api.serializer_with_object_normalizer:
    class: Symfony\Component\Serializer\Serializer
    arguments:
        0:
            - "@our_custom_serviec_which_override_object_normalizer.inner"
        1:
            - "@serializer.encoder.json"

答案 1 :(得分:-1)

public function someAction(SerializerInterface $serializer): Response // Add serializer as an argument
{
    $goodViews = //here I get an array of Value Objects or DTO's ;

    // normalize gives me a proper array for serialization
    return $this->json(
         $serializer->normalize($goodViews)
    );
}

services.yml

# *Bundle/Resources/services.yaml
services:
    YourNamespace/*Bundle/Controller/YourController:
        tags: [ 'controller.service_arguments' ]

尝试一下,让我们知道。这应该可以帮助您,但是有更好的方法可以配置项目。在此处查看有关将控制器用作服务以及如何自动连接控制器的更多信息。

https://symfony.com/doc/3.4/service_container.html

https://symfony.com/doc/3.4/serializer.html