【发布时间】:2014-01-26 17:05:39
【问题描述】:
我已经在我的注册表单 (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 会抛出以下异常。
属性“groups”和方法之一“setGroups()”都不是, "_set()" 或 "_call()" 存在并在类中具有公共访问权限 “xx\UserBundle\Entity\User”。
抛出异常。/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 版
谢谢。
【问题讨论】:
-
是时候使用集合表单类型了。
-
请展示你的代码
-
我认为集合不是正确的表单类型。用户可以选择现有组。他无法添加新组。在我看来,Symfony 不会检测到用户和组之间的多对多关系。一般来说,我的表单看起来正确,但行为错误。