如何正确地将Symfony Serializer注入控制器?

问题描述 投票:1回答:2

我有一个问题,将Symfony Serializer注入控制器。这是我想要实现的行为的一个工作示例:

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)
    );
}

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

我想从动作中的服务容器中获取序列化服务(使用$ this-> get('serializer'))或者将它注入到使用NormalizerInterface的控制器构造函数中(我需要对对象数组进行规范化),但是这个注入的序列化器因为这样的错误而跌倒:

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

所以我想,它的配置方式与我手工创建的Serializer一样。

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

symfony dependency-injection serializer
2个回答
0
投票

我的问题的决定有点棘手。 ObjectNormalizer被自定义规范化器覆盖(在自定义服务防御中具有装饰部分 - 请参阅https://symfony.com/doc/3.4/service_container/service_decoration.html)。这就是为什么在预配置Symfony Serializer的框架中我得到了我的自定义产品,这产生了一个错误:

无法规范化属性\“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
投票
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

© www.soinside.com 2019 - 2024. All rights reserved.