无限循环存储库 symfony2 fos 用户包
Infinite loop repository symfony2 fos user bundle
我只是覆盖了 Symfony2 的 FOSUser Bundle 的 UserManager.php
,尤其是 updateUser 函数(我有最新版本的 bundle 和最新版本的框架)。
这是函数(带有调试部分):
<?php
/**
* Updates a user.
*
* @param UserInterface $user
* @param Boolean $andFlush Whether to flush the changes (default true)
*/
public function updateUser(UserInterface $user, $andFlush = true, $form = false)
{
$this->updateCanonicalFields($user);
$this->updatePassword($user);
if ($form !== false) {
$em = $this->objectManager;
$user->setStatus($em->getRepository('BirdOfficeBundle:Status')->find(1));
$language = $em->getRepository('BirdOfficeBundle:Language')->getLanguage(1);
echo '<pre>';
var_dump($language);die();
//$user->setLanguage($em->getRepository('BirdOfficeBundle:Language')->find(1));
//$user->setType($em->getRepository('BirdOfficeBundle:Type')->find(1));
echo '<pre>';var_dump($user);die();
}
$this->objectManager->persist($user);
if ($andFlush) {
$this->objectManager->flush();
}
}
?>
我想用这个函数做的是在提交注册表后从我的 RegistrationController.php
(registerAction 方法)调用它。
问题如下:
当我设置我的状态时,它工作得很好。当我尝试使用其他存储库(如 Langue、Type 或其他)的查找方法时,我的网络浏览器崩溃了。
我尝试在另一个控制器中使用它进行测试,效果很好。
那么,可能是什么问题?
顺便说一句,我尝试使用 findAll 或个人查询,但它也崩溃了。
我检查了我的 dev.log
文件,里面没有 event.ERROR
。
我终于找到了解决办法。
我删除了对我自己的函数(getStatus
、getLanguage
、getType
)的 find()
调用,并在里面放了一个 try/catch 调用。
现在,效果非常好!
这是 Acme/AcmeBundle/Repository/LanguageRepository.php
的代码
<?php
namespace Acme\AcmeBundle\Repository;
use Doctrine\ORM\EntityRepository;
class LanguageRepository extends EntityRepository
{
public function getLanguage($id) {
$db = $this
->createQueryBuilder('l')
->andWhere('l.id = :id')
->setParameter('id', $id)
;
try {
$language = $db->getQuery()->getSingleResult();
} catch (\Doctrine\Orm\NoResultException $e) {
$language = null;
}
return $language;
}
}
还有我的UserManager.php
方法的代码:
<?php
$language = $em->getRepository('AcmeBundle:Language')->getLanguage(1);
if (is_null($language)) {
$language = 1;
}
$user->setLanguage($language);
之后,我启动了一个php app/console cache:clear
非常感谢 ;)
加布里埃尔
我只是覆盖了 Symfony2 的 FOSUser Bundle 的 UserManager.php
,尤其是 updateUser 函数(我有最新版本的 bundle 和最新版本的框架)。
这是函数(带有调试部分):
<?php
/**
* Updates a user.
*
* @param UserInterface $user
* @param Boolean $andFlush Whether to flush the changes (default true)
*/
public function updateUser(UserInterface $user, $andFlush = true, $form = false)
{
$this->updateCanonicalFields($user);
$this->updatePassword($user);
if ($form !== false) {
$em = $this->objectManager;
$user->setStatus($em->getRepository('BirdOfficeBundle:Status')->find(1));
$language = $em->getRepository('BirdOfficeBundle:Language')->getLanguage(1);
echo '<pre>';
var_dump($language);die();
//$user->setLanguage($em->getRepository('BirdOfficeBundle:Language')->find(1));
//$user->setType($em->getRepository('BirdOfficeBundle:Type')->find(1));
echo '<pre>';var_dump($user);die();
}
$this->objectManager->persist($user);
if ($andFlush) {
$this->objectManager->flush();
}
}
?>
我想用这个函数做的是在提交注册表后从我的 RegistrationController.php
(registerAction 方法)调用它。
问题如下:
当我设置我的状态时,它工作得很好。当我尝试使用其他存储库(如 Langue、Type 或其他)的查找方法时,我的网络浏览器崩溃了。
我尝试在另一个控制器中使用它进行测试,效果很好。
那么,可能是什么问题?
顺便说一句,我尝试使用 findAll 或个人查询,但它也崩溃了。
我检查了我的 dev.log
文件,里面没有 event.ERROR
。
我终于找到了解决办法。
我删除了对我自己的函数(getStatus
、getLanguage
、getType
)的 find()
调用,并在里面放了一个 try/catch 调用。
现在,效果非常好!
这是 Acme/AcmeBundle/Repository/LanguageRepository.php
<?php
namespace Acme\AcmeBundle\Repository;
use Doctrine\ORM\EntityRepository;
class LanguageRepository extends EntityRepository
{
public function getLanguage($id) {
$db = $this
->createQueryBuilder('l')
->andWhere('l.id = :id')
->setParameter('id', $id)
;
try {
$language = $db->getQuery()->getSingleResult();
} catch (\Doctrine\Orm\NoResultException $e) {
$language = null;
}
return $language;
}
}
还有我的UserManager.php
方法的代码:
<?php
$language = $em->getRepository('AcmeBundle:Language')->getLanguage(1);
if (is_null($language)) {
$language = 1;
}
$user->setLanguage($language);
之后,我启动了一个php app/console cache:clear
非常感谢 ;)
加布里埃尔