我正在尝试为我的Symfony2单页应用程序设置路由,但我不确定如何正确处理它而不会感觉超级hacky。
以下是我需要它做的以及我是如何尝试设置的:
经过身份验证
任何请求application/json
的路线都应该照常设置路线。
任何未请求application/json
的路由都应该加载一个控制器,该控制器呈现包含我的单页应用程序的所有JS的twig文件。
任何不存在且结束寻找symfony路由的静态资源,例如[.js,.css,.jpeg等]应该返回404。
未经过身份验证时
请求application/json
的任何内容都应返回403
任何不请求application/json
的内容都应返回登录页面
这是我到目前为止所尝试的内容:
使用每个服务的FOSRestBundle设置路由
如果请求不是application/json
,则设置一个返回基本控制器html的侦听器
if (!in_array('application/json', $request->getAcceptableContentTypes())) {
$fakeRequest = $event->getRequest()->duplicate(
null,
null,
array('_controller' => 'HvHDashboardBundle:Dashboard:index')
);
$controller = $this->resolver->getController($fakeRequest);
$event->setController($controller);
}
如果静态资源不存在,设置一堆'catch all'路由伪造404。
# routing.yml
# Catch any files that are meant to be their own static resource and return 404
catch_all_fail:
pattern: /{uri}.{_format}
defaults: { _controller: MyBundle:Dashboard:return404 }
requirements:
_format: js|hbs|css|jpg|gif|jpeg|png
问题
问题:
其他如何使用Symfony解决路由和单页应用程序的问题,他们最初需要使用twig呈现HTML,然后JS接管并请求JSON?
答案 0 :(得分:1)
只制作API,根本不制作静态页面。相信我,我最近使用Symfony做了一个中等大小的API,这是最佳选择。如果您不将API与静态页面混合,它将大大简化您的后端安全性。当然,如果你想拥有某种登陆页面,你仍然可以拥有静态页面。但尽量不要将它们与主应用程序混合使用。
即使是登录,也不要制作静态页面,而是使用api路由来验证用户名/密码,并为用户返回auth令牌作为响应。例如,一个用户可以拥有多个令牌(可以在多个位置登录),并且每次都会在请求标头中发送令牌。
如果令牌已经过验证,那么symfony会知道它属于哪个用户,因此您将会知道“用户”#。如果没有令牌,它应该返回"未经过身份验证",如果令牌无效也会出现类似或“错误请求”。
使用API时我必须做的一件事是我必须编写一个请求侦听器来接受JSON内容并将其转换为请求对象,因此我可以使用$ request-> request来访问数据。
如果您有任何疑问,请在评论中告诉我,我可以提供帮助。
就路由而言,遵循REST规则,您将会很高兴。