SYMFONY FORM ChoiceType, multiple=>true.如何绕过实现数据转换器的需要

SYMFONY FORM ChoiceType, multiple=>true. How to by pass the need to implement Data Transformers

在 SYMFONY FORM 中(不使用 ORM(PDO 用于数据库查询))。

我有一个 class MyEntityType,其中 buildForm 函数具有:

$builder->add('my_attribute',ChoiceType::class,array(
  'choices'=>$listForMyAttribute,
  'multiple'=>'true',
  'attr'=>array('data-native-menu'=>'false'),
  'label'=>'Multiple Select on my attribute'
));

我的属性是名为 MyEntity 的实体的数组,其中包含:

/**
* @Assert\NotBlank()
*/
private $myAttribute;

使用 getter 和 setter 变量 $myAttribute。

当我在控制器中提交表单时,它没有通过验证检查并记录了这个错误:

无法反转 属性 路径的值 "myAttribute": 找不到给定值的所有匹配选项。

当我开始围绕此错误消息寻找解决方案时,它会导致 SYMFONY Cookbook 中名为 "How to Use Data Transformers" 的内容;似乎一个解决方案涉及创建新的 Class 并为应该能够以更直接的方式绕过的东西编写大量代码。

有人知道吗?

我的问题是我的数组 $listForMyAttribute 是在 buildForm() 函数中定义的,它的定义依赖于一些条件。

第一次展示这个就满足了做数组的条件

按下提交按钮后,在Controller中重新生成了buildForm,第二次,不满足创建数组$listForMyAttribute[的条件=20=] 与第一次显示时一样。因此,程序 抛出 "contraint not met error",因为无法找到为该字段提交的值

今天我遇到了完全相同的问题。解决方案很简单,如 1-2-3.

1) 创建实用程序虚拟对象 class DoNotTransformChoices

<?php
namespace AppBundle\DataTransformer;

use Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface;

class DoNotTransformChoices implements ChoiceListInterface 
{
    public function getChoices() { return []; }
    public function getValues() { return []; }
    public function getPreferredViews() { return []; }
    public function getRemainingViews() { return []; }
    public function getChoicesForValues(array $values) { return $values; }
    public function getValuesForChoices(array $choices) { return $choices; }
    public function getIndicesForChoices(array $choices) { return $choices; }
    public function getIndicesForValues(array $values) { return $values; }
}

2) 在您的字段中添加以下附加选项:

   ...
   'choice_list' => new DoNotTransformChoices,
   ...

3) 恭喜!