错误:新值必须是\ Traversable,实体类的数组或实例

时间:2016-09-01 11:34:29

标签: php forms symfony doctrine-orm many-to-many

我在manyToManyPost之间建立了Category关联。我正在尝试提交帖子表单,以便从下拉列表<select>创建包含所选类别的帖子。

表单使用以下方式呈现correclty:

<div id="form-categories-widget">
    <select id="shop_bundle_managementbundle_posttype_categories" 
        name="shop_bundle_managementbundle_posttype[categories]">
        {% for key,val in form.categories.vars.choices %}
        <option value="{{ val.value }}" {{  form.categories.vars.value == '' and key == 0 ? ' selected ' :(val.value == form.categories.vars.value ? ' selected ' : '') }}
            >
            {{ val.data.getName | trans }} 
        </option>
        {% endfor %}
    </select>
</div> 

问题:

当我点击提交按钮时,我有以下错误(我花了大约2天的时间试图弄明白):

  

属性&#34;类别&#34;在班上   &#34;铺\捆绑\ ManagementBundle \实体\后&#34;可以用。来定义   方法&#34; addCategory()&#34;,&#34; removeCategory()&#34;但新的价值必须是   \ Traversable的数组或实例,   &#34;铺\捆绑\ ManagementBundle \实体\类别&#34;给出。

这是我的表单类型和实体(如果它们有用的话)。我提前感谢你宝贵的时间和平常的帮助。

实体发布:

<?php

namespace Shop\Bundle\ManagementBundle\Entity;

class Post
{
.....
    /**
     * @var \Doctrine\Common\Collections\Collection
     */
    private $categories;


    /**
     * Add category
     *
     * @param \Shop\Bundle\ManagementBundle\Entity\Category $category
     *
     * @return Post
     */
    public function addCategory(\Shop\Bundle\ManagementBundle\Entity\Category $category)
    {
        $this->categories[$category->getName()] = $category;
        $category->addPost($this);
        return $this;
    }

    /**
     * Remove category
     *
     * @param \Shop\Bundle\ManagementBundle\Entity\Category $category
     */
    public function removeCategory(\Shop\Bundle\ManagementBundle\Entity\Category $category)
    {
        $this->categories->removeElement($category);
    }

    /**
     * Get categories
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getCategories()
    {
        return $this->categories;
    }


}

PostType

class PostType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('categories', 'entity', array(
                'multiple' => false,   // Multiple selection allowed
                'expanded' => false,   // Render as checkboxes
                'class' => 'ShopManagementBundle:Category',
                'property'     => 'name'
            ));

    }
    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Shop\Bundle\ManagementBundle\Entity\Post'

        ));
    }
    /**
     * @return string
     */
    public function getBlockPrefix()
    {
        return 'shop_bundle_managementbundle_posttype';
    }

}

2 个答案:

答案 0 :(得分:1)

您的字段“类别”必须是实体的CollectionType,而不仅仅是实体。

在您的示例中,您尝试替换类别实体的集合$ categories。

阅读本文:CollectionType Field

但我认为存在一个误解:你试图给一个帖子提供多个类别? 你扭转了这件事吗?一个类别包含多个帖子?

http://symfony.com/doc/current/reference/forms/types/collection.html

答案 1 :(得分:1)

问题来自表单模板,因为我手动编码它忘记了双括号[]。所以而不是:

<select id="shop_bundle_managementbundle_posttype_categories" 
        name="shop_bundle_managementbundle_posttype[categories]">

我应该一直在使用:

<select id="shop_bundle_managementbundle_posttype_categories" 
        name="shop_bundle_managementbundle_posttype[categories][]">

我希望其他人不会犯同样的错误。

由于