2014-02-05 7 views
0

Я хочу сделать перенаправление в конструкторе в конкретном порядке. Я попытался сделать это следующим образом:symfony2 redirect in constructor

return new \Symfony\Component\HttpFoundation\RedirectResponse($url); 

и так:

return $this->redirect($url); 

Но это не работает. В любом другом методе он работает, но по какой-то причине, когда этот код находится в конструкторе, он не работает. Нет ошибок или предупреждений.

Если вам нужна дополнительная информация, уточните в комментариях. Спасибо за внимание.

+3

В конструкторе чего? –

+2

Плохая идея использовать перенаправление в конструкторах –

+0

@Markus Kottländer: В конструкторе моего контроллера. Виктор: Почему это плохая идея? – gprusiiski

ответ

1

Плохая идея использовать перенаправление в конструкторах. Конструктор возвращает только текущий object of the class (объект контроллера в вашем случае), и он не может вернуть redirect object. Может быть, вы можете решить задачу по маршруту, используя FrameworkBundle:Redirect:urlRedirect:

# redirecting the root 
root: 
    path:/
    defaults: 
     _controller: FrameworkBundle:Redirect:urlRedirect 
     path: /app 
     permanent: true 

Проверить примеры в How to Configure a Redirect without a Custom Controller

+0

Хорошо, но как я могу сделать условие. Например, у меня есть URL-адрес, например «mysite.com/product», и при посещении этого URL-адреса, если, например, $ this-> session-> get ('some flag') является ложным, чтобы перенаправить его на другой URL-адрес, true для продолжения, как обычно. – gprusiiski

+0

Нужно реализовать в контроллере 'action' непосредственно –

+0

да, но мне нужно реализовать эту логику, чтобы все методы вместо этого использовались только в одном месте (вот почему я хочу сделать это перенаправление в конструкторе). Я мог бы сделать это с помощью брандмауэров и зон безопасности, но это не стоит для меня только для одного случая. – gprusiiski

0

плохая идея перенаправить от контроллера непосредственно. Я предпочел бы бросить какое-то особое исключение.

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); 
     } 
    } 
} 

Этот способ может поддерживать единую обработку ошибок и перенаправление логику. Слишком сложно?