布尔值和选择 symfony 类型

Posted

技术标签:

【中文标题】布尔值和选择 symfony 类型【英文标题】:Boolean values and choice symfony type 【发布时间】:2017-01-09 09:49:06 【问题描述】:

使用 Symfony 框架的选择类型,我们可以决定使用这两个键来显示列表、单选按钮或复选框:

'multiple' => false,
'expanded' => true,  //example for radio buttons

假设'choices'键中作为数组给出的不同选择的值不是字符串,而是布尔值:

$builder->add('myproperty', 'choice', array(
    'choices' => array(
        'Yes' => true,
        'No' => false
     ),
     'label' => 'My Property',
     'required' => true,
     'empty_value' => false,
     'choices_as_values' => true
 )); 

使用列表(选择)显示不同的选项没有问题,当显示表单时,列表中的正确选项被选中。

如果我添加我之前谈到的两个键(多个键和扩展键)以用单选按钮替换列表,则我的字段没有选择按钮(尽管它与选择一起使用)。

有人知道为什么吗?

如何轻松实现?

谢谢

注意:实际上我认为它不适用于任何 then 因为值是布尔值并最终成为字符串,但由于它适用于列表,我想知道为什么它不适用于其他人。

【问题讨论】:

我认为empty_value 不适用于单选按钮。相反,您可以使用“数据”选项强制该值。 array('required' => true, 'data' => false, 'choices_as_values' => true) empty_value 在值不是布尔值时与单选按钮一起使用。我考虑了一个解决方案,即为实体创建一个转换器,但没有更简单的方法通过框架 【参考方案1】:

我添加了一个数据转换器;

$builder->add('myproperty', 'choice', array(
    'choices' => array(
        'Yes' => '1',
        'No' => '0'
     ),
     'label' => 'My Property',
     'required' => true,
     'empty_value' => false,
     'choices_as_values' => true
 )); 

 $builder->get('myProperty')
    ->addModelTransformer(new CallbackTransformer(
        function ($property) 
            return (string) $property;
        ,
        function ($property) 
            return (bool) $property;
        
  ));

这很神奇:现在我选中了正确的单选按钮并在实体中设置了正确的值。

【讨论】:

看起来 Symfony 现在可以在不添加 Transformer 的情况下处理这种情况:您可以直接使用 'choices' => ['Yes' => true, 'No' => false],这非常简单 在我的情况下,此更改有效$builder->get('myProperty') ->addModelTransformer(new CallbackTransformer( function ($property) return (string) $property; , function ($property) return (bool) $property; ));【参考方案2】:

另一种解决方案是使用 Doctrine Lifecycle Callbacksphp Type Casting

使用这个 FormType:

use Symfony\Component\Form\Extension\Core\Type\ChoiceType;

//...

$builder->add('active', ChoiceType::class, [
    'choices' => [
        'active' => true,
        'inactive' => false
    ]
])

还有这样的实体:

//...
use Doctrine\ORM\Mapping as ORM;

/**
 * ...
 * @ORM\HasLifecycleCallbacks()                      /!\ Don't forget this!
 * ...
 */
class MyEntity 

    //..

    /**
     * @var bool
     *
     * @ORM\Column(name="active", type="boolean")
     */
    private $active;

    //...

    /**
     * @ORM\PrePersist()
     */
    public function prePersist()
    
        $this->active = (bool) $this->active; //Force using boolean value of $this->active
    

    /**
     * @ORM\PreUpdate()
     */
    public function preUpdate()
    
        $this->active = (bool) $this->active;
        

    //...

【讨论】:

【参考方案3】:

我的解决方案:

/**
 * @var BooleanToStringTransformer $transformer
*/
private $transformer;

/**
  * @param BooleanToStringTransformer $transformer
 */
public function __construct(BooleanToStringTransformer $transformer) 
   $this->transformer = $transformer;



public function buildForm(FormBuilderInterface $builder, array $options)

    $builder
        ->add('myProperty', TextType::class, [
            'empty_data' => false,
        ])
    ;

    $builder->get('myProperty')->addModelTransformer($this->transformer);


<?php

namespace App\DataTransformer;

use Symfony\Component\Form\DataTransformerInterface;

/**
 * Class BooleanToStringTransformer
 *
 * @package App\DataTransformer
 */
class BooleanToStringTransformer implements DataTransformerInterface

    /**
     * @param bool $boolean
     *
     * @return string
     */
    public function transform($boolean): string
    
        // transform the boolean to a string
        return $boolean ? 'true' : 'false';
    

    /**
     * @param string $string
     *
     * @return bool
     */
    public function reverseTransform($string): bool
    
        // transform the string back to a boolean
        return filter_var($string, FILTER_VALIDATE_BOOL);
    

【讨论】:

以上是关于布尔值和选择 symfony 类型的主要内容,如果未能解决你的问题,请参考以下文章

为啥是布尔值和布尔值

day02python中的基本数据类型-布尔值和字符串

类型-graphql。字符串、布尔值和数字的联合类型失败

Scikit - 具有布尔值和特征选择的多项式回归

使用 Swift,从 plist 加载数据时,如何区分布尔值和整数值?

布尔值和格式化输出