Symfony2表单BooleanToStringTransformer问题

Nan*_*com 4 forms symfony-forms symfony symfony-2.3

我有一个布尔字段,我把它作为一个选择字段放在一个表单中(是或否).没有数据转换器,我会得到0或1.我添加了一个视图BooleanToStringTransformer(看起来合理):

$builder
        ->add(
            $builder->create('myBooleanField', 'choice', array(
                'choices' => array(true => 'Yes', false => 'No'),
            ))
            ->addViewTransformer(new BooleanToStringTransformer('1'))
        )
Run Code Online (Sandbox Code Playgroud)

当我尝试显示表单时,我收到错误"Expected a Boolean.".在创建表单之前,我的字段设置为false.

我试图将它设置为模型转换器:表单被调度,但是当我提交它时,我的字段被声明为无效.

我究竟做错了什么?

编辑:我差不多了.

  • 我使用模型变换器而不是视图变换器(选择字段使用字符串或整数,而不是布尔值)
  • 我将选择列表从更改array(true => 'Yes', false => 'No')array('yes' => 'Yes', 'no' => 'No')

所以代码现在看起来像 ->addModelTransformer(new BooleanToStringTransformer('yes'))

数据转换工作,除了我的字段始终设置为true,无论我选择什么值.

怎么了?

Nan*_*com 5

答案是:我不应该想到默认的Symfony BooleanToStringDataTransformer正在完成这项工作.它为false值而不是字符串返回null.

所以我创建了自己的datatransformer:

<?php

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

class BooleanToStringTransformer implements DataTransformerInterface
{
    private $trueValue;
    private $falseValue;

    public function __construct($trueValue, $falseValue)
    {
        $this->trueValue = $trueValue;
        $this->falseValue = $falseValue;
    }

    public function transform($value)
    {
        if (null === $value) {
             return null;
        }

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

        return true === $value ? $this->trueValue : $this->falseValue;
    }

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

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

        return $this->trueValue === $value;
    }
}
Run Code Online (Sandbox Code Playgroud)