如何解决Symfony 注册后重定向到引用页面
在我的 Symfony 5 项目中,我有一个仅限会员使用的付款页面。
/**
* @Route("/membership_payment/{id}",name="membership_payment")
* @IsGranted("ROLE_MEMBER")
*/
如果未登录,则用户可以选择登录或注册。
如果他们登录,他们会被重定向回正确的页面 (/membership_payment/{id}
),但是如果他们注册,他们会正确注册并自动登录,但会返回到 /register
页面而不是 /membership_payment/{id}
{1}} 页。
我已按照 SymfonyCasts 上的说明进行操作,但看不到我做错了什么。
我的注册控制器:
/**
* @Route("/register",name="app_register")
*
* @return \Symfony\Component\HttpFoundation\Response
*/
public function register(Request $request,UserPasswordEncoderInterface $passwordEncoder,GuardAuthenticatorHandler $guardHandler,LoginFormAuthenticator $authenticator) :Response
{
$user = new User();
$form = $this->createForm(RegistrationFormType::class,$user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $this->getDoctrine()->getManager();
$user->setPassword(
$passwordEncoder->encodePassword(
$user,$form->get('plainPassword')->getData()
)
);
$user->setRoles(['ROLE_MEMBER']);
$user->setMembership($entityManager->getRepository(Membership::class)->find(1));
$entityManager->persist($user);
$entityManager->flush();
return $guardHandler->authenticateUserAndHandleSuccess(
$user,$request,$authenticator,'main' // firewall name in security.yaml
);
}
return $this->render(
'registration/register.html.twig',[
'registrationForm' => $form->createView(),]
);
}
security.yaml
security:
enable_authenticator_manager: true
encoders:
App\Entity\User:
algorithm: auto
providers:
# used to reload user from session & other features (e.g. switch_user)
app_user_provider:
entity:
class: App\Entity\User
property: email
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
lazy: true
provider: app_user_provider
guard:
authenticators:
- App\Security\LoginFormAuthenticator
logout:
path: app_logout
target: home
remember_me:
secret: '%kernel.secret%'
secure: true
在 LoginFormAuthenticator 中
public function onAuthenticationSuccess(Request $request,TokenInterface $token,$providerKey) :RedirectResponse
{
if ($targetPath = $this->getTargetPath($request->getSession(),$providerKey)) {
return new RedirectResponse($targetPath);
}
return new RedirectResponse($this->urlGenerator->generate('home'));
}
解决方法
我脑子里放了个屁,我自己已经弄明白了。
注册路由未包含在我的 RequestSubscriber 排除项中...
class RequestSubscriber implements EventSubscriberInterface
{
use TargetPathTrait;
private SessionInterface $session;
public function __construct(SessionInterface $session)
{
$this->session = $session;
}
public function onKernelRequest(RequestEvent $event) :void
{
$request = $event->getRequest();
if (
!$event->isMasterRequest()
|| $request->isXmlHttpRequest()
|| 'app_login' === $request->attributes->get('_route')
|| 'app_register' === $request->attributes->get('_route') // I needed to add this
) {
return;
}
$this->saveTargetPath($this->session,'main',$request->getUri());
}
public static function getSubscribedEvents() :array
{
return [
KernelEvents::REQUEST => ['onKernelRequest'],];
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。