【问题标题】:Symfony form wrong property mapping in enitiesSymfony 在实体中形成错误的属性映射
【发布时间】: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 不会检测到用户和组之间的多对多关系。一般来说,我的表单看起来正确,但行为错误。

标签: php forms symfony


【解决方案1】:

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

'多个' => 真

到表单实体

【讨论】:

  • Adding: 'multiple' => true 确实停止了应用程序中断,现在我的屏幕上没有错误。但是数据库仍然没有更新新用户 (fos_user) 和用户组 (fos_user_group) 的详细信息。我按照github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/… 中的说明安装了 FOSUserBundle,请提出我所缺少的。我的实体和表单类型与#createproblem 发布的完全相同。我也没有手动添加 setGroups() 函数。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 2015-01-22
    • 1970-01-01
    相关资源
    最近更新 更多