我对Symfony有点新鲜,但我有一个容易解释的情况:
我有一个公共主页和一个私人主页。我希望通过网址" /"
访问这两个网址当未经过身份验证的人访问地址www.example.com/时,我希望将他们路由到PublicController :: indexAction()
当经过身份验证的用户访问地址www.example.com/时,我希望将其路由到Privatecontroller :: indexAction()
这可能吗?
(symfony 2.7 btw)
答案 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 %}