使用symfony2时,我想显示不同的布局(guest虚拟机的base.html.twig和已登录用户的layout.html.twig)。
当用户连接到他的帐户时,他也可以(如Facebook所做的那样)“连接”作为一个页面或一组(总是在他的帐户内),对于这两个我也必须显示不同的布局( pagelayout.html.twig和grouplayout.html.twig)。
似乎解决方案是创建一个控制器(例如indexAction),其中包含会话和数据库查询的所有条件。
例如(我更改了代码以进行简化):
public function indexAction(){
// ...
if (!$mySession) { //the user is not connected
//redirection to home controller that uses base.twig.html
} else { //the user is logged in
if ($connectAs=='profile') {
//redirection to home controller that uses layout.twig.html
} else if($connectAs=='page') {
//redirection to page controller that uses pagelayout.twig.html
} else if($connectAs=='group') {
//redirection to group controller that uses grouplayout.twig.html
}
}
}
我想在一个重定向控制器中使用这些条件,但我认为这不是一个灵活的解决方案。因为我可以集成其他类型的布局和控制器,我可能需要添加更多条件。
是否有更好的解决方案,而不是更灵活?
编辑:此解决方案的另一个问题是,即使用户作为“页面”连接,他仍然可以输入到组或用户控制器的路由的URL并获取也可以访问它们......除非我在这些控制器中添加了条件。
我需要的是创建一个像frontController一样的控制器
答案 0 :(得分:1)
如果你想要一个类似逻辑的前控制器,你需要用一个控制器捕获所有可能的路由,然后从那里开始。
# all other routed efinitions should go above this,
# so that _frontcontroller acts like a fallback
_frontcontroller:
path: /{url}
defaults: { _controller: YourFrontBundle:Front:index }
requirements:
name: ".+" #allow / in the route
然后你的控制器应该根据条件和网址转发给控制器
public function indexAction($url)
{
// ...
} else if ($connectAs=='group') {
$this->forward('YourGroupBundle:Group:index');
// or something else based on the url parameter
}
// ...
}
还有CMF Bundle有dynamic routing,但我还没有深入研究。