Php symfony2控制器中的会话条件

Php symfony2控制器中的会话条件,php,symfony,redirect,layout,controller,Php,Symfony,Redirect,Layout,Controller,使用symfony2时,我希望显示不同的布局(base.html.twig用于来宾,layout.html.twig用于登录用户) 当一个用户连接到他的帐户时,他也可以(像facebook那样)“连接为”一个页面或一个组(总是在他的帐户内),对于这两个页面,我还必须显示不同的布局(pagelayout.html.twig和grouplayout.html.twig) 解决方案似乎是创建一个控制器(例如indexAction),其中包含会话和数据库查询的所有条件 例如(为了简化,我更改了代码):

使用symfony2时,我希望显示不同的布局(base.html.twig用于来宾,layout.html.twig用于登录用户)

当一个用户连接到他的帐户时,他也可以(像facebook那样)“连接为”一个页面或一个组(总是在他的帐户内),对于这两个页面,我还必须显示不同的布局(pagelayout.html.twig和grouplayout.html.twig)

解决方案似乎是创建一个控制器(例如indexAction),其中包含会话和数据库查询的所有条件

例如(为了简化,我更改了代码):

我想在一个重定向控制器中使用这些条件,但我认为这不是一个灵活的解决方案。因为我可以集成其他类型的布局和控制器,我可能需要添加更多的条件

有比更灵活的更好的解决方案吗

编辑:此解决方案的另一个问题是,即使用户作为“页面”连接,他仍然可以键入指向组或用户控制器的路由的URL,并访问它们。。。除非我也在这些控制器中添加了条件


我确切需要的是创建一个像frontController一样的控制器

如果你想要一个像frontController一样的逻辑,你需要用一个控制器捕捉所有可能的路线,然后从那里前进

# 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
然后,控制器应根据条件和url转发给控制器

public function indexAction($url)
{
    // ...
    } else if ($connectAs=='group') {
        $this->forward('YourGroupBundle:Group:index');
        // or something else based on the url parameter
    }
    // ...
}

还有一个CMF包,它有,但我还没有深入研究。

为什么不设置一个
$template
变量并将其传递给控制器的呈现函数?因为这不仅是布局的问题,也是数据库数据的问题,页面和组的表以及它们的查询都不同,这就是为什么我需要使用来自不同捆绑包的不同控制器的原因。因此,我认为我需要创建一个类似于frontController的东西,来处理这些数据并决定执行哪个控制器。但这是您已经遇到的问题,我想我不理解这个问题/也许你可以使用多个防火墙。是的,我的朋友,非常感谢你。。。这正是我需要的,我将转发我的控制器。再次感谢+1.
public function indexAction($url)
{
    // ...
    } else if ($connectAs=='group') {
        $this->forward('YourGroupBundle:Group:index');
        // or something else based on the url parameter
    }
    // ...
}