FOSUserBundle и FOSFacebookBundle: userManager-> updateUser (): «неизвестная ошибка» (это ошибка доктрины) - PullRequest
4 голосов
/ 28 октября 2011

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 совпадает с документацией ( читайте здесь )

Следующим элементом является вывод print_r($user); непосредственно перед выполнением $this->userManager->updateUser($user);:

Acme\MyBundle\Entity\User Object
(
    [id:protected] =>
    [facebookID:protected] => 847000001
    [first_name:protected] => Peter
    [middle_name:protected] =>
    [last_name:protected] => Parker
    [fullname:protected] => Peter Parker
    [locale:protected] => en_US
    [timezone:protected] => 2
    [updated_time:protected] => 2011-10-27T17:13:24+0000
    [birthday:protected] => DateTime Object
        (
            [date] => 1961-07-01 10:31:53
            [timezone_type] => 3
            [timezone] => Europe/Berlin
        )
    [languages:protected] => Doctrine\Common\Collections\ArrayCollection Object
        (
        [_elements:Doctrine\Common\Collections\ArrayCollection:private] => Array
            (
        [0] => Acme\MyBundle\Entity\SpokenLanguage Object
            (
            [facebookID:Acme\MyBundle\Entity\SpokenLanguage:private] => 113051505375958
            [name:Acme\MyBundle\Entity\SpokenLanguage:private] => Italien
            )
        [1] => Acme\MyBundle\Entity\SpokenLanguage Object
            (
            [facebookID:Acme\MyBundle\Entity\SpokenLanguage:private] => 112264595467201
            [name:Acme\MyBundle\Entity\SpokenLanguage:private] => Français
            )
        [2] => Acme\MyBundle\Entity\SpokenLanguage Object
            (
            [facebookID:Acme\MyBundle\Entity\SpokenLanguage:private] => 103803232991647
            [name:Acme\MyBundle\Entity\SpokenLanguage:private] => English
            )
        )
    )
    [usernameFB:protected] => spiderman
    [username:protected] => Peter Parker
    [usernameCanonical:protected] =>
    [email:protected] => peterparker@marvel.com
    [emailCanonical:protected] =>
    [enabled:protected] => 1
    [algorithm:protected] =>
    [salt:protected] =>
    [password:protected] =>
    [plainPassword:protected] =>
    [lastLogin:protected] =>
    [confirmationToken:protected] => 540grdgfg343004g8g0skg0wg408k
    [passwordRequestedAt:protected] =>
    [groups:protected] =>
    [locked:protected] =>
    [expired:protected] =>
    [expiresAt:protected] =>
    [roles:protected] => Array
        (
            [0] => ROLE_FACEBOOK
        )

    [credentialsExpired:protected] =>
    [credentialsExpireAt:protected] =>
)

Сообщение об ошибке: "UNKNOWN ERROR" .Поэтому я решил пойти посмотреть, куда отправляется это сообщение в Bundle.И я обнаружил, что это было установлено в Исключении.Я решил вывести сообщение об исключении.

Таким образом, под сообщением об исключении:

Новый объект был найден через отношение «Acme \ MyBundle \ Entity \ User # languages»,не настроен для каскадного сохранения операций для объекта: Acme \ MyBundle \ Entity \ SpokenLanguage @ 000000004a9e2dfa0000000001482b74.Явно сохраняйте новый объект или настраивайте каскадные сохраняющиеся операции в отношении.Если вы не можете выяснить, какая сущность является причиной проблемы, используйте 'Acme \ MyBundle \ Entity \ SpokenLanguage #__ toString ()', чтобы получить подсказку.

Так что, я думаю, я недостаточно хорошо закодировал аннотации Doctrineмоего класса User, и проблема в отображении ассоциации ManyToMany ().

Здесь аннотации поля $ languages ​​в моих Acme\MyBundle\Entity\User.php:

/**
 * @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;

Ребята, вы что-нибудь имеете в виду, как решить проблему?Я думаю о проблеме каскадирования.

Спасибо всем.

1 Ответ

2 голосов
/ 13 декабря 2011

ХОРОШО! Я наконец-то решил это!

Вы должны добавить параметр cascade={'persist','remove','merge'} к аннотации ManyToMany.

Как это:

@ORM\ManyToMany(targetEntity="SpokenLanguage", cascade={"persist", "remove", "merge"})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...