Symfony在注册后重定向到引用页面



在我的Symfony 5项目中,我有一个仅限会员使用的付款页面。

/**
* @Route("/membership_payment/{id}", name="membership_payment")
* @IsGranted("ROLE_MEMBER")
*/

如果未登录,则用户可以选择登录或注册。如果他们登录,则会重定向回正确的页面(/membership_payment/{id}(,但如果他们注册,则会正确注册并自动登录,但会返回到/register页面,而不是/membership_payment/{id}页面。

我遵循了SymfonyCasts上的指示,看不出我做错了什么。

我的注册管理员:

/**
* @Route("/register", name="app_register")
*
* @return SymfonyComponentHttpFoundationResponse
*/
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:
AppEntityUser:
algorithm: auto
providers:
# used to reload user from session & other features (e.g. switch_user)
app_user_provider:
entity:
class: AppEntityUser
property: email
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
lazy: true
provider: app_user_provider
guard:
authenticators:
- AppSecurityLoginFormAuthenticator
logout:
path: app_logout
target: home
remember_me:
secret: '%kernel.secret%'
secure: true

在登录FormAuthenticator 中

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'],
];
}
}

最新更新