我有一个问题,将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感谢您的关注。
我的问题的决定有点棘手。 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"
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' ]
试一试,告诉我们。这应该可以让您前进,但有更好的方法可以配置您的项目。有关使用控制器作为服务以及如何自动装配它们的更多信息,请在此处查看。