Symfony查看transfomer。 ReverseTransform未被调用

时间:2014-11-07 23:03:16

标签: symfony

我正在尝试构建客户表单字段。这是一个日期选择器,但我的视图数据转换器出现问题。忘记日期选择器的东西,我把它归结为一个简单的骨头例子。这只是显示和接受日期。 Symfony日期类型的简化版本。

我将这种类型捆绑在一起。

namespace AppBundle\Form\Type;

use AppBundle\Form\DataTransformer\DateToStringTransformer;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class MyDateType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->addViewTransformer(new DateToStringTransformer());
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults([]);
    }

    public function getName()
    {
        return 'mydate';
    }
}

这是我的变压器。

namespace AppBundle\Form\DataTransformer;

use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;

class DateToStringTransformer implements DataTransformerInterface
{
    public function transform($value)
    {
        if (null === $value) {
            return '';
        }

        if (!$value instanceof \DateTime) {
            throw new TransformationFailedException('Expected a \DateTime.');
        }

        return $value->format('n/j/Y');
    }

    public function reverseTransform($value)
    {
        if (empty($value)) {
            return null;
        }

        if (!is_string($value)) {
            throw new TransformationFailedException('Expected a string.');
        }

        return \DateTime::createFromFormat('n/j/Y', $value);
    }
}

服务定义如下:

mydate:
    class: AppBundle\Form\Type\MyDateType
    tags:
        - { name: form.type, alias: mydate}

在AppBundle / Resources / Views / form.html.twig。

{% block mydate_widget %}
    {{ block('form_widget_simple') }}
{% endblock %}

在config.yml

twig:
    form:
        resources:
            - 'AppBundle:Form:fields.html.twig'

在控制器中。

/**
 * @Route("/test2")
 */
public function test2Action(Request $request)
{
    $form = $this->createFormBuilder([
        'date' => \DateTime::createFromFormat('n/j/Y', '11/20/2014')
    ])
        ->add('date', 'mydate')
        ->add('submit', 'submit')
        ->getForm()
        ;

    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {

    }

    return $this->render('default/test2.html.twig', [
        'form' => $form->createView()
    ]);
}

变压器从日期到字符串工作。它的变换方法被调用,日期显示正常。但是在发布表单时不会调用reverseTransform。

我觉得我错过了一些可以告诉它发布值来自哪里的东西。它当然应该是输入元素的发布值,但我不太清楚它是如何自动发生的。

我需要型号变压器吗?我不这么认为,因为我的“模型数据”和“规范数据”都是DateTime。我只需要转换为视图的字符串。

1 个答案:

答案 0 :(得分:2)

咄!刚发现它。

在MyDateType中我需要

$resolver->setDefaults([
    'compound' => false
]);