【问题标题】:FOSRestBundle and JMSSerializer custom form error handlerFOSRestBundle 和 JMSSerializer 自定义表单错误处理程序
【发布时间】:2015-08-03 20:46:47
【问题描述】:

我为 JMSSerializerBundle 编写了一个自定义表单处理程序,我将它与 FOSRestBundle 一起使用。根据documentation,它应该像正确标记服务一样简单。但是我的自定义处理程序永远不会被使用。

这是处理程序:

<?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-&gt;get('my_form_error_handler') 并且成功了,所以我知道该服务已注册。任何帮助表示赞赏。

谢谢。

【问题讨论】:

    标签: php symfony fosrestbundle jmsserializerbundle


    【解决方案1】:

    您不是通过标记来启用表单错误处理程序,而是通过设置jms_serializer.form_error_handler.class 参数来指向您的类:

    parameters: jms_serializer.form_error_handler.class: AppBundle\Handler\FormErrorHandler

    【讨论】:

      猜你喜欢
      • 2014-12-22
      • 2014-06-26
      • 1970-01-01
      • 2017-12-18
      • 2018-04-29
      • 2011-06-01
      • 1970-01-01
      • 2010-12-26
      相关资源
      最近更新 更多