Где делать редирект?

Для выполнения редиректов в Symfony у вас есть несколько вариантов мест, где вы можете их выполнить. Выбор зависит от того, в какой части приложения вы пишете код и какой тип редиректа вам требуется. Вот несколько вариантов:

1. В контроллере: Если вы хотите сделать редирект внутри контроллера, то вы можете воспользоваться специальным методом redirect() из базового контроллера. Пример:

use SymfonyComponentHttpFoundationRedirectResponse;
use SymfonyComponentRoutingAnnotationRoute;

class MyController extends AbstractController
{
    /**
     * @Route("/my-route")
     */
    public function myAction(): RedirectResponse
    {
        return $this->redirect('/new-route');
    }
}

Такой редирект выполнит перенаправление на указанный URL.

2. В маршрутах (routes): Если вы хотите выполнить перенаправление на уровне маршрутов, вы можете использовать аннотацию RedirectResponse. Пример:

use SymfonyComponentHttpFoundationRedirectResponse;
use SymfonyComponentRoutingAnnotationRoute;

class MyController extends AbstractController
{
    /**
     * @Route("/old-route", defaults={"_redirect": "/new-route"})
     */
    public function myAction(): RedirectResponse
    {
        // В этом методе можно делать какие-то операции, если нужно
        // они будут выполнены перед редиректом

        throw new RuntimeException('This should not be reached.');
    }
}

В этом случае, при обращении к маршруту /old-route будет сделан автоматический редирект на маршрут /new-route.

3. Внутри сервисов: Если вам требуется выполнить редирект внутри какого-либо сервиса, вы можете внедрить в него SymfonyComponentHttpFoundationRedirectResponseFactoryInterface и использовать его метод createRedirectResponse(). Пример:

use SymfonyComponentHttpFoundationRedirectResponseFactoryInterface;

class MyService
{
    private $redirectResponseFactory;

    public function __construct(RedirectResponseFactoryInterface $redirectResponseFactory)
    {
        $this->redirectResponseFactory = $redirectResponseFactory;
    }

    public function myMethod()
    {
        // Ваша логика

        return $this->redirectResponseFactory->createRedirectResponse('/new-route');
    }
}

В этом случае редирект будет выполняться внутри вашего сервиса.

4. В Event Subscriber: Если вы хотите выполнять редирект на уровне обработки событий (Event Subscriber) в Symfony, то вам следует использовать SymfonyComponentHttpFoundationRedirectResponse и вернуть его из вашего обработчика события. Пример:

use SymfonyComponentEventDispatcherEventSubscriberInterface;
use SymfonyComponentHttpFoundationRedirectResponse;
use SymfonyComponentHttpKernelEventResponseEvent;
use SymfonyComponentHttpKernelKernelEvents;

class MySubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return [
            KernelEvents::RESPONSE => 'onKernelResponse',
        ];
    }

    public function onKernelResponse(ResponseEvent $event)
    {
        // Ваша логика

        $response = new RedirectResponse('/new-route');
        $event->setResponse($response);
    }
}

Таким образом, при возникновении события RESPONSE будет осуществлен редирект.

Выбор места для выполнения редиректа зависит от ваших потребностей и организации кода.