我对 Symfony 有点陌生,但我有一个易于解释的情况:
我有一个公共主页和一个私人主页。我想通过 URL“/”访问这两个
当未经身份验证的人访问地址 www.example.com/ 我希望他们被路由到 PublicController::indexAction()
当经过身份验证的用户访问地址 www.example.com/ 我希望他们被路由到 Privatecontroller::indexAction()
这可能吗?
(symfony 2.7 顺便说一句)
我对 Symfony 有点陌生,但我有一个易于解释的情况:
我有一个公共主页和一个私人主页。我想通过 URL“/”访问这两个
当未经身份验证的人访问地址 www.example.com/ 我希望他们被路由到 PublicController::indexAction()
当经过身份验证的用户访问地址 www.example.com/ 我希望他们被路由到 Privatecontroller::indexAction()
这可能吗?
(symfony 2.7 顺便说一句)
绝对有可能,尽管细节取决于您在每个控制器操作中所做的事情。最简单的方法是:
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 的 Controller 类中的方法),如果有,将请求转发到PrivateController:indexAction
. 如果不是,那么它只是按预期显示公共行为。如果您期望登录的用户多于注销的用户,则可以反转这一点,因为转发会降低性能(因为 Symfony 将创建和发送子请求)。
更长的答案是了解您在需要它们分开的每个控制器中所做的事情,以及您是否可以将功能组合到服务中或以其他方式重新构建它们。在不了解您的特定问题域的情况下,以上似乎是最好的方法。
有一个在 Symfony 上运行的社交网络启动(总是使用最新版本)所以我自然地遇到了这个挑战,即在主页上显示不同的内容,首先取决于您的登录状态,其次是否登录不同的个性化内容取决于您的登录用户身份。尽管上面的答案有效,但我发现使用 twig 显示哪些内容会更好且性能更好,因为我可以使用 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 %}