Я хочу сделать перенаправление в конструкторе в конкретном порядке. Я пытался сделать это так:
return new \Symfony\Component\HttpFoundation\RedirectResponse($url);
а вот так:
return $this->redirect($url);
Но это не сработает. В любом другом методе он работает, но по какой-то причине, когда этот код находится в конструкторе, он не работает. Нет ошибок или предупреждений.
Если вам нужна дополнительная информация в комментариях. Спасибо за время.
Плохая идея использовать перенаправление в конструкторах. Конструктор возвращает только текущий object of the class
(объект контроллера в вашем случае), и он не может вернуть redirect object
. Возможно, вы можете решить свою задачу на маршруте, используя FrameworkBundle:Redirect:urlRedirect
:
# redirecting the root root: path: / defaults: _controller: FrameworkBundle:Redirect:urlRedirect path: /app permanent: true
по# redirecting the root root: path: / defaults: _controller: FrameworkBundle:Redirect:urlRedirect path: /app permanent: true
Проверьте примеры в настройке перенаправления без пользовательского контроллера
Плохая идея перенаправить с контроллера напрямую. Я предпочел бы бросить какое-то особое исключение.
class FooController{ public function __construct(){ if ( some_test ){ throw RedirectionException(); // name it however you like } } }
Затем в Symfony
настройте ExceptionListener
который будет оценивать тип класса Exception
и при необходимости перенаправит ваше приложение на другой URL. Эта услуга, скорее всего, будет зависеть от службы @routing
для генерации альтернативного адресата URL.
Конфигурация службы:
services: kernel.listener.your_listener_name: class: Your\Namespace\AcmeExceptionListener tags: - { name: kernel.event_listener, event: kernel.exception, method: onKernelException }
Класс слушателя:
class AcmeExceptionListener { public function onKernelException(GetResponseForExceptionEvent $event) { // You get the exception object from the received event $exception = $event->getException(); if ( $exception instanceof RedirectionException ){ $response = new RedirectResponse(); $event->setResponse($response); } } }
Этот способ может поддерживать единую логику обработки ошибок и перенаправления. Слишком сложно?