Ситуация: по умолчанию доступна только основная страница, всем остальным страницам нужен зарегистрированный пользователь. Когда модуль загружается без пользователя, должен отображаться шаблон входа в систему, а не модуль. Другими словами, $sf_content
должен быть опустошен в layout.php
который не является на 100% нормально, поскольку в макете есть логика. Есть ли для этого элегантный способ? Я не думаю, что помощник в порядке …
Проверьте фильтры безопасности, это один стандартный способ безопасности, разработанный в Symfony. Вы даже можете реализовать свой собственный класс SecurityFilter с требуемой функциональностью.
http://symfony.com/legacy/doc/reference/1_4/en/12-Filters#chapter_12_security
Это делается по умолчанию для фильтра sfBasicSecurityFilter
. Вам просто нужна хорошая конфигурация. Прочтите эту часть учебника Jobeet. Для аутентификации пользователя вы должны использовать sfDoctrineGuardPlugin
(или sfGuardPlugin
если используете Propell).
Чтобы завершить мои комментарии выше: Существуют различные способы переопределения макета. Вы можете использовать методы:
setLayout($name) //or using foward, which forwards current action to a new one (without browser redirection) forward($module, $action);
внутри вашего класса действия. Если вы хотите изменить макет внутри фильтра, вы можете использовать что-то подобное:
class yourFilter extends sfFilter { public function execute($filterChain) { if($yourConditionForOverrideTheDefaultLayout) { //here the syntax to change the layout from the filer $actionStack = $this->getContext()->getActionStack(); $actionStack->getFirstEntry()->getActionInstance()->setLayout('yourLayout'); } $filterChain->execute(); } }
Чтобы избежать ненужного дублирования в файле макета, вы можете работать с фрагментами и частицами.