Forms Symfony2形成布尔串变压器问题

Forms Symfony2形成布尔串变压器问题,forms,symfony,symfony-forms,symfony-2.3,Forms,Symfony,Symfony Forms,Symfony 2.3,我有一个布尔字段,我把它放在一个表单中作为选择字段(是或否)。 如果没有数据转换器,我将得到0或1。 我添加了一个BooleantString Transformer视图(看起来很合理): 当我试图显示表单时,我得到一个错误“预期为布尔值”。 但在创建表单之前,我的字段设置为false 我试图将其设置为模型转换器:表单被显示,但当我提交它时,我的字段被声明为无效 我做错了什么 编辑:我现在快拿到了 我使用了模型转换器而不是视图转换器(选择字段使用字符串或整数,而不是布尔值) 我将我的选择列表从

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

当我试图显示表单时,我得到一个错误“预期为布尔值”。 但在创建表单之前,我的字段设置为false

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

我做错了什么

编辑:我现在快拿到了

  • 我使用了模型转换器而不是视图转换器(选择字段使用字符串或整数,而不是布尔值)
  • 我将我的选择列表从
    array(true=>'Yes',false=>'No')
    更改为
    array('Yes'=>'Yes','No'=>'No')
因此,代码现在看起来像
->addModelTransformer(新的BooleanToStringTransformer('yes'))

数据转换是有效的,除了我的字段总是设置为true,不管我选择什么值


怎么了?

您似乎使用了视图转换器而不是模型转换器。如果基础模型需要布尔值,则需要在模型转换器中将0/1反向转换为布尔值

。。或者,您可能没有在视图转换器中实现反向变换方法


阅读更多有关视图变压器和模型变压器之间的差异的信息。

答案是:我不应该认为默认的Symfony booleantostringdattransformer正在做这项工作。对于假值而不是字符串,它返回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;
    }
}

另一种解决方法可以是:

->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
    $data = $event->getData();

    if (isset($data['myBooleanField'])) {
        $data['myBooleanField'] = (bool) $data['myBooleanField'];

        $event->setData($data);
    }
})

布尔值不能用作规范化数据吗?顺便说一下,BooleantString Transformer是Symfony forms core扩展的一部分,我没有实现它。
->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
    $data = $event->getData();

    if (isset($data['myBooleanField'])) {
        $data['myBooleanField'] = (bool) $data['myBooleanField'];

        $event->setData($data);
    }
})