Symfony在enities中形成错误的属性映射

时间:2014-01-26 17:05:39

标签: php forms symfony

我已在我的注册表单(FOSUserBundle)中实施了一个组选择。提交表单后,Symfony将错误地映射我的类型。 目标是通过注册表单将选定的组添加到用户。

这是我的用户实体:

class User extends BaseUser
{
    protected $groups;

    public function __construct()
    {
        parent::__construct();

        $this->groups = new \Doctrine\Common\Collections\ArrayCollection();
    }

    public function addGroup(\FOS\UserBundle\Model\GroupInterface $groups)
    {
        $this->groups[] = $groups;

        return $this;
    }

    public function removeGroup(\FOS\UserBundle\Model\GroupInterface $groups)
    {
        $this->groups->removeElement($groups);
    }

    public function getGroups()
    {
        return $this->groups;
    }
}

以下是我的表单类型的相关部分。

$builder->add('groups', 'entity', array(
    'label' => 'Type',
    'required' => true,
    'class' => 'xxUserBundle:Group',
    'property' => 'name',
    'query_builder' => function(EntityRepository $er) {
        return $er->createQueryBuilder('g')->where('g.locked = false');
    }
))

提交后,Symfony会抛出以下异常。

  

属性“group”和方法“setGroups()”之一,   “_ set()”或“ _call()”存在并且在课堂上具有公共访问权限   “XX \ UserBundle \实体\用户”。

异常被抛入。/vendor/symfony/symfony/src/Symfony/Component/PropertyAccess/PropertyAccessor.php at line 376

对于数组属性,即教义中的任何manyToXX关系,没有自动生成的setter方法,对于数组,始终会生成add方法而不是set。为什么Symfony找不到合适的方法?

临时解决方案是add方法

public function setGroups(\FOS\UserBundle\Model\GroupInterface $groups)
{
    return $this->addGroup($groups);
}

到用户实体。但在我看来,这不是正确的解决方案......有人知道错误在哪里或发生了什么?

我正在使用Symfony版本2.4.1

感谢。

2 个答案:

答案 0 :(得分:1)

我也不想使用集合表单类型。 Symfony2, relation manyToMany in a Form给了我答案。添加:

'multiple'=>真

到表单实体

答案 1 :(得分:0)

你可能在'class'中指的是错误的类=> 'xxUserBundle:Group',但您显示的实体是User实体。这应该是用户实体吗?

我发现创建自己的表单类很有帮助,因为您可以更频繁地重用它,并且当您拥有更高级的表单(包括表单包含实体或集合的情况)时,实际上认为它使调试表单更容易。 http://symfony.com/doc/current/book/forms.html