2015-08-15 3 views
1

Я немного новичок в Symfony, но у меня легко объяснить ситуацию:маршрутизации один URL на два действия контроллера на основе аутентификации

У меня есть домашняя страница общественности и частный дом стр. Я хотел бы, чтобы оба этих файла были доступны с URL-адресом «/»

Когда лицо, не прошедшее проверку подлинности, посетило адрес www.example.com/ Я бы хотел, чтобы они были перенаправлены в PublicController :: indexAction ()

Когда идентифицированный пользователь посещает адрес www.example.com/ я хотел бы, чтобы они были направлены на Privatecontroller :: indexAction()

возможно ли это?

(Symfony 2,7 ​​кстати)

+0

Check [переадресации на другой контроллер] (http://symfony.com/doc/current/book/controller.html#forwarding-to-another-controller). Создайте 'PublicController :: indexAction', вызванный маршрутом'/'. И тогда вы должны переслать 'Privatecontroller :: indexAction', если использование завершено. –

ответ

1

Определенно возможно, хотя детали зависят от того, что вы делаете в каждом действии контроллера. Проще всего было бы иметь:

class PublicController extends \Symfony\Bundle\FrameworkBundle\Controller\Controller 
{ 
    public function indexAction() 
    { 
     if ($this->getUser() !== null) { 
      return $this->forward('BundleName:PrivateController:index'); 
     } 

     // do public controller details 
    } 
} 

Итак, все по умолчанию отправляется PublicController:indexAction, который делает проверку, чтобы увидеть, если есть зарегистрированный пользователь (используя getUser метод из класса контроллера Symfony), и если есть , forward the request до PrivateController:indexAction. Если нет, то он просто показывает публичные действия, как ожидалось. Вы можете инвертировать это, если вы ожидаете больше входа в систему, чем вышли из системы, так как будет наказание за пересылку (поскольку Symfony создаст и отправит подзапрос).

Более длинный ответ - это понимание того, что вы делаете в каждом контроллере, который требует, чтобы они были отдельными и могли ли вы объединить функциональность в службу или иным образом перепроектировать их. Не зная больше о вашем конкретном проблемном домене, вышесказанное кажется лучшим способом продвижения вперед.

+0

Хотя ваш ответ правильный, я бы не использовал эту возможность. Что делать, если пользователь вошел в систему, но хочет увидеть домашнюю страницу? –

+0

Не уверен, что я понимаю, хотя я предполагаю, что это связано с вашей конкретной проблемой, а не с вопросом, который вы задали. Если у вас есть два разных представления по одному и тому же URL-адресу, это означает, что у вас должны быть разные URL-адреса, поэтому у вас будет общедоступная домашняя страница (возможно, с визуальной индикацией, что вы вошли в систему '/'), а затем домашняя страница пользователя (например, показывающая пользовательский фид и т. д. на '/ user/home'). Надеюсь, это даст вам хоть какие-то идеи! –

+0

Точно, просто используйте два разных маршрута и два разных контроллера. –

0

У вас есть social network запуск на Symfony (всегда с использованием последних версий), поэтому, естественно, я столкнулся с этой проблемой, когда показывался другой контент на главной странице, зависящий от первого, состояния входа в систему или нет, а второй, если вы входите в другой персонализированный контент, ваш логин пользователя. Несмотря на то, что ответ выше, я нашел намного лучше и удобнее использовать ветку для отображения содержимого, потому что я мог бы использовать тег render_esi для использования обратного прокси-кеша и избегать не только поиска в базе данных, но генерации шаблонов и всего запроса на Symfony.

Например

{# src/MyApp/AppBundle/Resources/views/Page/index.html.twig #} 
{% extends 'MyAppAppBundle::layout.html.twig' %} 
..... 
    {% block body %} 
     {% if not app.user %} 
Code for non-logged in user 
e.g. {{ render_esi(controller('MyAppAppBundle:Home:non_logged_in_user')) }} 
     {% else %} 
Code for logged in user 
e.g {{ render_esi(controller('controller('MyAppAppBundle:Home:logged_in_user', { 'user': app.user.id })) }} 
     {% endif %} 
.... 
    {% endblock %}