Авторизированный пользователь и /login. как правильно редиректить?

В Symfony для редиректа авторизованных пользователей со страницы /login на другую страницу можно использовать middleware или иные способы, такие как подписка на событие или перенаправление в контроллере.

Предположим, у вас есть маршрут /login для страницы входа, и вы хотите, чтобы авторизованные пользователи были перенаправлены на страницу /home после успешной авторизации.

Один из способов реализации - использование middleware. В Symfony это можно сделать, создав класс авторизации и регистрируя его в файле конфигурации вашего проекта (обычно это файл app/AppKernel.php в Symfony 2.x или файл config/bundles.php в Symfony 4+).

// src/Security/AuthenticateMiddleware.php
namespace AppSecurity;

use SymfonyComponentHttpFoundationRedirectResponse;
use SymfonyComponentRoutingRouterInterface;
use SymfonyComponentSecurityCoreAuthenticationTokenStorageTokenStorageInterface;
use SymfonyComponentSecurityCoreAuthorizationAuthorizationCheckerInterface;

class AuthenticateMiddleware
{
    private $router;
    private $tokenStorage;
    private $authorizationChecker;

    public function __construct(RouterInterface $router, TokenStorageInterface $tokenStorage, AuthorizationCheckerInterface $authorizationChecker)
    {
        $this->router = $router;
        $this->tokenStorage = $tokenStorage;
        $this->authorizationChecker = $authorizationChecker;
    }

    public function __invoke($request, $next)
    {
        $route = $this->router->matchRequest($request);

        if ($route['_route'] === 'app_login' && $this->authorizationChecker->isGranted('IS_AUTHENTICATED_FULLY')) {
            return new RedirectResponse($this->router->generate('app_home'));
        }

        return $next($request);
    }
}

Затем зарегистрируйте данный класс в вашем файле конфигурации:

# app/config/config.yml или config/packages/security.yaml (в Symfony 4+)

services:
    app.middleware.authenticate:
        class: AppSecurityAuthenticateMiddleware
        arguments:
            - '@router'
            - '@security.token_storage'
            - '@security.authorization_checker'
        tags:
            - { name: kernel.event_listener, event: kernel.request, method: "__invoke" }

Вышеописанный код создаст middleware, который проверит текущий маршрут. Если пользователь находится на маршруте /login и уже авторизован, он будет перенаправлен на маршрут /home.

Настройка редиректа также можно реализовать в контроллере, который обрабатывает форму входа. Вам необходимо будет добавить условие, чтобы проверить, авторизован ли пользователь, и в случае успешной авторизации выполнить соответствующий редирект.

// src/Controller/SecurityController.php
namespace AppController;

use SymfonyComponentRoutingAnnotationRoute;
use SymfonyBundleFrameworkBundleControllerAbstractController;

class SecurityController extends AbstractController
{
    /**
     * @Route("/login", name="app_login")
     */
    public function login()
    {
        if ($this->isGranted('IS_AUTHENTICATED_FULLY')) {
            return $this->redirectToRoute('app_home');
        }

        // Обработка логики входа
        // ...

        // Если логика входа успешна, выполните редирект
        return $this->redirectToRoute('app_home');
    }
}

Это наиболее простые и распространенные способы выполнения редиректа авторизованных пользователей со страницы /login на другую страницу.