Symfony FOS UserBundle:覆盖错误登陆页面
Symfony FOS UserBundle: override error landing page
我正在重写我的 Symfony 应用程序上的表单,但我肯定在这个过程中跳过了一些东西,但我不知道是什么。
基本上,一切正常,看起来就像我想要的那样,但是一旦我故意产生错误(即:将电子邮件地址更改为无效地址),我就会被重定向到孤独的表单模板,而不是使用生成的问题重新加载到我的页面并显示问题。
我尝试替换这一行:
return $this->render('@FOSUser/Profile/edit.html.twig', array(
'form' => $form->createView(),
));
来自 ProfileController,我认为这是原因,但我做错了,尝试时出现错误。
在显示已提交表单的错误的同时转到包含其他表单的自定义个人资料页面的正确语法是什么?
我假设您已经用自己的 UserBundle 覆盖了 FOSUserBundle(如 official documentation 中所述)。然后,你必须修改你自己的 ProfileController
中的函数 editAction()
,并编写你的 UserBundle 配置文件页面的 twig 模板(请看我在下面代码中的最后评论):
<?php
// src/UserBundle/Controller/ProfileController.php
namespace UserBundle\Controller;
// use statements
class ProfileController extends Controller
{
/**
* Edit the user.
*
* @param Request $request
*
* @return Response
*/
public function editAction(Request $request)
{
$user = $this->getUser();
if (!is_object($user) || !$user instanceof UserInterface) {
throw new AccessDeniedException('This user does not have access to this section.');
}
/** @var $dispatcher EventDispatcherInterface */
$dispatcher = $this->get('event_dispatcher');
$event = new GetResponseUserEvent($user, $request);
$dispatcher->dispatch(FOSUserEvents::PROFILE_EDIT_INITIALIZE, $event);
if (null !== $event->getResponse()) {
return $event->getResponse();
}
/** @var $formFactory FactoryInterface */
$formFactory = $this->get('fos_user.profile.form.factory');
$form = $formFactory->createForm();
$form->setData($user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
/** @var $userManager UserManagerInterface */
$userManager = $this->get('fos_user.user_manager');
$event = new FormEvent($form, $request);
$dispatcher->dispatch(FOSUserEvents::PROFILE_EDIT_SUCCESS, $event);
$userManager->updateUser($user);
if (null === $response = $event->getResponse()) {
$url = $this->generateUrl('fos_user_profile_show');
$response = new RedirectResponse($url);
}
$dispatcher->dispatch(FOSUserEvents::PROFILE_EDIT_COMPLETED, new FilterUserResponseEvent($user, $request, $response));
return $response;
}
// Change the following line, with your custom profile twig template
//return $this->render('@FOSUser/Profile/edit.html.twig', array(
return $this->render('UserBundle:Profile:edit.html.twig', array(
'form' => $form->createView(),
));
}
}
我正在重写我的 Symfony 应用程序上的表单,但我肯定在这个过程中跳过了一些东西,但我不知道是什么。
基本上,一切正常,看起来就像我想要的那样,但是一旦我故意产生错误(即:将电子邮件地址更改为无效地址),我就会被重定向到孤独的表单模板,而不是使用生成的问题重新加载到我的页面并显示问题。
我尝试替换这一行:
return $this->render('@FOSUser/Profile/edit.html.twig', array(
'form' => $form->createView(),
));
来自 ProfileController,我认为这是原因,但我做错了,尝试时出现错误。
在显示已提交表单的错误的同时转到包含其他表单的自定义个人资料页面的正确语法是什么?
我假设您已经用自己的 UserBundle 覆盖了 FOSUserBundle(如 official documentation 中所述)。然后,你必须修改你自己的 ProfileController
中的函数 editAction()
,并编写你的 UserBundle 配置文件页面的 twig 模板(请看我在下面代码中的最后评论):
<?php
// src/UserBundle/Controller/ProfileController.php
namespace UserBundle\Controller;
// use statements
class ProfileController extends Controller
{
/**
* Edit the user.
*
* @param Request $request
*
* @return Response
*/
public function editAction(Request $request)
{
$user = $this->getUser();
if (!is_object($user) || !$user instanceof UserInterface) {
throw new AccessDeniedException('This user does not have access to this section.');
}
/** @var $dispatcher EventDispatcherInterface */
$dispatcher = $this->get('event_dispatcher');
$event = new GetResponseUserEvent($user, $request);
$dispatcher->dispatch(FOSUserEvents::PROFILE_EDIT_INITIALIZE, $event);
if (null !== $event->getResponse()) {
return $event->getResponse();
}
/** @var $formFactory FactoryInterface */
$formFactory = $this->get('fos_user.profile.form.factory');
$form = $formFactory->createForm();
$form->setData($user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
/** @var $userManager UserManagerInterface */
$userManager = $this->get('fos_user.user_manager');
$event = new FormEvent($form, $request);
$dispatcher->dispatch(FOSUserEvents::PROFILE_EDIT_SUCCESS, $event);
$userManager->updateUser($user);
if (null === $response = $event->getResponse()) {
$url = $this->generateUrl('fos_user_profile_show');
$response = new RedirectResponse($url);
}
$dispatcher->dispatch(FOSUserEvents::PROFILE_EDIT_COMPLETED, new FilterUserResponseEvent($user, $request, $response));
return $response;
}
// Change the following line, with your custom profile twig template
//return $this->render('@FOSUser/Profile/edit.html.twig', array(
return $this->render('UserBundle:Profile:edit.html.twig', array(
'form' => $form->createView(),
));
}
}