Php &引用;无法反转属性路径“的值”;对于Symfony2表单选项,请选择2上的Type字段

Php &引用;无法反转属性路径“的值”;对于Symfony2表单选项,请选择2上的Type字段,php,ajax,forms,symfony,Php,Ajax,Forms,Symfony,长话短说,在Symfony 2.8中,我有一个Movie实体和actors字段,这是实体Actor(manytomy)的ArrayCollection),我希望该字段是ajax加载的Select2。 当我不使用Ajax时,表单是: ->add('actors', EntityType::class, array( 'class' => Actor::class, 'label' => "Actors of the work", '

长话短说,在Symfony 2.8中,我有一个
Movie
实体和
actors
字段,这是实体
Actor
manytomy
)的
ArrayCollection
),我希望该字段是ajax加载的Select2。 当我不使用Ajax时,表单是:

->add('actors', EntityType::class, array(
        'class' => Actor::class,
        'label' => "Actors of the work",
        'multiple' => true,
        'attr' => array(
          'class' => "select2-select",
         ),
       ))
它是有效的

我试图在其中放置一个空的选择字段:

->add('actors', ChoiceType::class, array(
    'mapped' => false,
    'multiple' => true,
    'attr'=>array(
        'class' => "select2-ajax",
        'data-entity'=>"actor"
    )
))
Select2 Ajax工作正常,DOM中的所有内容看起来都与上一个示例中的相同,但在表单提交时,探查器中出现错误:
此值无效。

Symfony\Component\Validator\ConstraintViolation
Object(Symfony\Component\Form\Form).children[actors] = [0 => 20, 1 => 21]
Caused by:
Symfony\Component\Form\Exception\TransformationFailedException
Unable to reverse value for property path "actors": Could not find all matching choices for the given values
Caused by:
Symfony\Component\Form\Exception\TransformationFailedException
Could not find all matching choices for the given values
有趣的是,接收到的数据与作为
实体类型时的数据相同:
[0=>20,1=>21]

我将字段标记为未映射,甚至将字段名更改为非电影实体的字段名。我尝试添加空的
选项
,我尝试将其保留为
EntityType
,但使用自定义
query\u builder
,返回空集合。现在我没有主意了

我该怎么做

在Raymond的回答后编辑

我添加了DataTransformer:

将其添加到电影类型buildForm()的末尾。

和附加服务:

common.form.type.work:
    class: CompanyName\Common\CommonBundle\Form\Type\MovieType
    arguments: ["@doctrine.orm.entity_manager"]
    tags:
        - { name: form.type }
没有什么变化。在表单提交时,
reverseTransform()
获取正确的数据,但探查器显示相同的错误。现在这对我来说是一个很大的疑问…

您需要添加一个DTO(数据转换器)来转换从表单接收到的值并返回相应的对象。 由于您从Ajax调用该值,它不再将其识别为对象,而是文本值

示例:


  • 正确的方法不是数据转换器,而是表单事件,请看这里:

    在本例中,您有野外运动(一个实体,如
    电影
    )和野外位置(另一个实体,如
    演员
    )。 诀窍是使用ajax完全重新加载表单并使用
    PRE\u SET\u DATA
    POST\u SUBMIT


    我使用的是Symfony 3.x,但我认为它与2.8.x相同,当您添加数据转换器时,似乎没有任何变化,听起来数据似乎从未经过数据转换器。在调用新的数据转换器之前,转换可能会失败。尝试在代码中添加几行:

    $builder->get('actors')->resetViewTransformers();
    $builder->get('actors')->resetModelTransformers();
    // and then add your own
    

    谢谢你能看看我编辑的问题吗?也许你会发现我遗漏了什么…?你找到解决问题的方法了吗?我现在也遇到了同样的问题Hello@rogaa,我刚刚回复了一个解决方案。我也遇到过同样的情况,但是这个链接帮助了我:它使用表单事件来管理与ajax相关的实体。谢谢你的回复-这个问题已经不存在了。但我知道文件,尤其是这部分。不幸的是,我无法让它运行(即使是symfony示例)。也许你可以为社区建立一个关于gist的工作解决方案?不过,谢谢你,你的回答是我解决问题的出发点。
    common.form.type.work:
        class: CompanyName\Common\CommonBundle\Form\Type\MovieType
        arguments: ["@doctrine.orm.entity_manager"]
        tags:
            - { name: form.type }
    
    $builder->get('actors')->resetViewTransformers();
    $builder->get('actors')->resetModelTransformers();
    // and then add your own