【问题标题】:FOSUserBundle and FOSFacebookBundle : userManager->updateUser() : "unknown error" (it is a doctrine error)FOSUserBundle 和 FOSFacebookBundle : userManager->updateUser() : "unknown error" (这是一个教义错误)
【发布时间】:2011-10-28 14:07:23
【问题描述】:

FOSUserBundle 非常适合我正在进行的项目。但我正在尝试嵌入 FOSFacebookBundle 并使其与 FOSUserBundle 一起使用。

为此,我构建了自己的Acme\MyBundle\Entity\User.php,以添加一些我想从 Facebook 存储的字段,以及提供 UserBundle 的内容。这 此类的代码已经过调试并且可以正常工作(嗯...这就是我的想法!见下文)。

不起作用的是(在我的 Acme\MyBundle\Security\User\Provider\FacebookProvider.php 中,在 loadUserByUsername() 中)这一行:

        $this->userManager->updateUser($user);

Acme\MyBundle\Security\User\Provider\FacebookProvider.php 与文档相同(read it here

以下元素是print_r($user); 的输出,就在 $this->userManager->updateUser($user); 的执行:

Acme\MyBundle\Entity\User 对象 ( [id:受保护] => [facebookID:受保护] => 847000001 [first_name:protected] => 彼得 [中间名:受保护] => [姓氏:受保护] => 帕克 [全名:受保护] => 彼得·帕克 [语言环境:受保护] => en_US [时区:受保护] => 2 [updated_time:protected] => 2011-10-27T17:13:24+0000 [生日:受保护] => 日期时间对象 ( [日期] => 1961-07-01 10:31:53 [时区类型] => 3 [时区] => 欧洲/柏林 ) [语言:受保护] => Doctrine\Common\Collections\ArrayCollection 对象 ( [_elements:Doctrine\Common\Collections\ArrayCollection:private] => 数组 ( [0] => Acme\MyBundle\Entity\SpokenLanguage 对象 ( [facebookID:Acme\MyBundle\Entity\SpokenLanguage:private] => 113051505375958 [名称:Acme\MyBundle\Entity\SpokenLanguage:private] => 意大利语 ) [1] => Acme\MyBundle\Entity\SpokenLanguage 对象 ( [facebookID:Acme\MyBundle\Entity\SpokenLanguage:private] => 112264595467201 [名称:Acme\MyBundle\Entity\SpokenLanguage:private] => Français ) [2] => Acme\MyBundle\Entity\SpokenLanguage 对象 ( [facebookID:Acme\MyBundle\Entity\SpokenLanguage:private] => 103803232991647 [名称:Acme\MyBundle\Entity\SpokenLanguage:private] => 英语 ) ) ) [usernameFB:protected] => 蜘蛛侠 [用户名:受保护] => 彼得·帕克 [用户名Canonical:受保护] => [电子邮件:受保护] => peterparker@marvel.com [电子邮件规范:受保护] => [启用:受保护] => 1 [算法:受保护] => [盐:受保护] => [密码:受保护] => [plainPassword:protected] => [lastLogin:protected] => [confirmationToken:protected] => 540grdgfg343004g8g0skg0wg408k [passwordRequestedAt:protected] => [组:受保护] => [锁定:受保护] => [过期:受保护] => [expiresAt:protected] => [角色:受保护] => 数组 ( [0] => ROLE_FACEBOOK ) [凭据过期:受保护] => [credentialsExpireAt:protected] => )

消息错误是“未知错误”。所以我决定去看看这条消息在Bundle中的发送位置。而且我发现它被设置在一个异常中。我决定输出异常消息。

所以在异常消息下方:

通过关系发现了一个新实体 'Acme\MyBundle\Entity\User#languages' 未配置为 实体的级联持久化操作: Acme\MyBundle\Entity\SpokenLanguage@000000004a9e2dfa0000000001482b74。 显式持久化新实体或配置级联持久化 关系上的操作。如果您无法找出哪个实体 导致问题执行 'Acme\MyBundle\Entity\SpokenLanguage#__toString()' 来获得线索。

所以我想我的 User 类的 Doctrine Annotations 没有很好地编码,问题是 ManyToMany() 关联映射。

这里是我的 Acme\MyBundle\Entity\User.php 中 $languages 字段的注释:

/**
 * @var \Doctrine\Common\Collections\ArrayCollection
 * @ORM\ManyToMany(targetEntity="SpokenLanguage")
 * @ORM\JoinTable(name="users_spokenlanguage",
 *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="spokenlanguage_id", referencedColumnName="facebookID")}
 *      )
 */
protected $languages;

你们有什么办法解决这个问题吗? 我正在考虑一个级联问题。

谢谢大家。

【问题讨论】:

  • 好的!我已经解决了这个问题...最后您必须将参数cascade={'persist','remove','merge'} 添加到Annotation ManyToMany。像这样:@ORM\ManyToMany(targetEntity="SpokenLanguage", cascade={"persist", "remove", "merge"})
  • 请发表您的评论作为答案并接受它;)

标签: doctrine-orm symfony


【解决方案1】:

好的!我终于解决了这个问题!

您必须将参数cascade={'persist','remove','merge'} 添加到Annotation ManyToMany。

像这样:

@ORM\ManyToMany(targetEntity="SpokenLanguage", cascade={"persist", "remove", "merge"})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多