【问题标题】:Symfony2 Forms BooleanToStringTransformer IssueSymfony2 表单 BooleanToStringTransformer 问题
【发布时间】:2013-08-30 08:29:01
【问题描述】:

我有一个布尔字段,我已将其作为选择字段(是或否)放入表单中。 如果没有数据转换器,我会得到 0 或 1。 我添加了一个视图 BooleanToStringTransformer (这似乎是合理的):

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

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

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

我做错了什么?

编辑:我现在差不多了。

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

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

数据转换有效,只是我的字段始终设置为 true,无论我选择什么值。

怎么了?

【问题讨论】:

    标签: forms symfony symfony-forms symfony-2.3


    【解决方案1】:

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

    所以我创建了自己的数据转换器:

    <?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;
        }
    }
    

    【讨论】:

      【解决方案2】:

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

      .. 或者您可能错过了在视图转换器中实现反向转换方法。

      详细了解 View 和 Model 转换器之间的区别here

      【讨论】:

      • 布尔值不能用作标准化数据吗?顺便说一句,BooleanToStringTransformer 是 Symfony 表单核心扩展的一部分,我没有实现它。
      【解决方案3】:

      另一种解决方法是:

      ->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
          $data = $event->getData();
      
          if (isset($data['myBooleanField'])) {
              $data['myBooleanField'] = (bool) $data['myBooleanField'];
      
              $event->setData($data);
          }
      })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多