基于身份验证将一个URL路由到两个控制器操作

时间:2015-08-15 19:11:25

标签: symfony symfony-security symfony-routing

我对Symfony有点新鲜,但我有一个容易解释的情况:

我有一个公共主页和一个私人主页。我希望通过网址" /"

访问这两个网址

当未经过身份验证的人访问地址www.example.com/时,我希望将他们路由到PublicController :: indexAction()

当经过身份验证的用户访问地址www.example.com/时,我希望将其路由到Privatecontroller :: indexAction()

这可能吗?

(symfony 2.7 btw)

2 个答案:

答案 0 :(得分: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,它会检查是否有登录用户(使用Symfony的Controller类中的getUser方法),如果有,{{3 }到PrivateController:indexAction。如果没有,那么它只是按预期显示公共行动。如果您希望登录的用户比登出的用户更多,则可以将其反转,因为转发会有性能损失(因为Symfony将创建和发送子请求)。

更长的答案是了解您在每个控制器中所做的事情,这些控制器要求它们是独立的,以及您是否可以将功能组合到服务中或以其他方式重新构建它们。如果不了解您的具体问题领域,上述内容似乎是最好的前进方式。

答案 1 :(得分:0)

在Symfony上运行social network启动(总是使用最新版本)所以我自然而然地遇到了这样的挑战,即在主页上显示不同的内容,这取决于第一个,您的登录或未登录状态,以及第二个如果登录不同的个性化内容取决于您登录的用户ID。虽然上面的答案有效,但我发现使用twig显示哪些内容更好,更高效,因为我可以使用render_esi标记来使用反向代理缓存,而不仅仅是数据库查找,而是模板生成和整个请求命中Symfony。 / p>

例如

{# 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 %}