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