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;
Ребята, вы что-нибудь имеете в виду, как решить проблему?Я думаю о проблеме каскадирования.
Спасибо всем.