我为JMSSerializerBundle编写了一个自定义表单处理程序,我正在使用FOSRestBundle。根据{{3}},它应该像正确标记服务一样简单。但我的自定义处理程序永远不会被使用。
这是处理程序:
<?php
namespace AppBundle\Handler;
use JMS\Serializer\Handler\FormErrorHandler as JMSFormErrorHandler;
class FormErrorHandler extends JMSFormErrorHandler
{
public function serializeFormToJson(\JMS\Serializer\JsonSerializationVisitor $visitor, \Symfony\Component\Form\Form $form, array $type)
{
$this->convertFormToArray($visitor, $form);
}
private function getErrorMessage(FormError $error)
{
if (null !== $error->getMessagePluralization()) {
return $this->translator->transChoice($error->getMessageTemplate(), $error->getMessagePluralization(), $error->getMessageParameters(), 'validators');
}
return $this->translator->trans($error->getMessageTemplate(), $error->getMessageParameters(), 'validators');
}
private function convertFormToArray(GenericSerializationVisitor $visitor, Form $data)
{
$isRoot = null === $visitor->getRoot();
$form = $errors = array();
foreach ($data->getErrors() as $error) {
$errors[] = $this->getErrorMessage($error);
}
if ($errors) {
$form['errors'] = $errors;
}
$children = array();
foreach ($data->all() as $child) {
if ($child instanceof Form) {
$children[$child->getName()] = $this->convertFormToArray($visitor, $child);
}
}
if ($children) {
$form = array_merge($form , $children);
}
if ($isRoot) {
$visitor->setRoot($form);
}
return $form;
}
}
这是服务注册
services:
my_form_error_handler:
class: AppBundle\Handler\FormErrorHandler
arguments: ["@translator"]
tags:
- {name: jms_serializer.subscribing_handler}
我不需要改变太多,因此大部分时间我只是扩展原始版本并更改了我需要更改的功能。
没有错误。所有内容都执行,好像没有覆盖类,它只使用JMSSerializer中的默认FormErrorHandler。这与使用FOSRestBundle有什么关系吗?对于咯咯笑声,在一个随机控制器中,我尝试了$this->get('my_form_error_handler')
并且有效,所以我知道该服务已注册。任何帮助表示赞赏。
感谢。