是否可以仅为XHR请求限制Symfony 2路由?我想声明只能通过AJAX访问的路由。
我不想在每个特定于AJAX的操作中添加一些额外的行:
if ($request->isXmlHttpRequest()) {
// do something
} else {
// do something else
}
我想定义:
为了解决上述情况。
答案 0 :(得分:89)
我知道这个问题有点老了但同时实现这个问题的新方式是在Symfony 2.4 中引入的。
Completely Customized Route Matching with Conditions
对于ajax限制,它看起来像这样:
contact:
path: /contact
defaults: { _controller: AcmeDemoBundle:Main:contact }
condition: "request.isXmlHttpRequest()"
也可以在注释中使用:
/**
* ContactAction
*
* @Route("/contact", name="contact", condition="request.isXmlHttpRequest()")
*/
答案 1 :(得分:10)
我的建议是定义您自己的路由器服务,而不是default,它将从Symfony\Bundle\FrameworkBundle\Routing\Router
扩展,并重新定义方法resolveParameters(),并实现您自己的逻辑以处理其他要求。< / p>
然后,您可以在路由中执行以下操作:
your_route:
pattern: /somepattern
defaults: { somedefaults }
requirements:
_request_type: some_requirement
答案 2 :(得分:3)
我不确定您是否可以阻止请求发生,但是您可以通过检查当前请求来检查Controller中的XHR请求
代码如下所示:
if ($request->isXmlHttpRequest()) {
// ...
}
由于浏览器不一致以及代理干扰的可能性等原因,这并非100%可靠。然而,它是检查异步请求的主要方法,并且被许多人推荐。如果你是cr
网址参数
另一种方法是在URL中添加一个参数,以将请求标识为异步。这是通过向您的网址添加?ajax=1
来实现的。然后,使用以下命令检查参数:
$AjaxRequest = $request->getParameter('ajax');
If($AjaxRequest == 1) {
//...
}
当然,此时您还可以创建一个特定的路线,例如/ajax/index/
。
答案 3 :(得分:2)
答案 4 :(得分:1)
Symfony路由配置中不存在您要查找的内容。
Request :: isXmlHttpRequest甚至不是100%可靠,并检查JavaScript库放置的HTTP头:
如果您的JavaScript库设置了X-Requested-With HTTP标头,则它可以正常工作。 众所周知,它可以与Prototype,Mootools,jQuery一起使用。
答案 5 :(得分:0)
您可以使用requirements来达到所述结果。
因此,假设您要将路由定义为yml格式,您必须执行类似这样的操作
my_route:
pattern: /path/to/route
defaults: { _controller: CompanyBundle:Controller:Action, _format: html }
requirements:
_format: xmlhttp /* not sure about the correct format because
i've never checked about */
当然,您可以使用_method: POST
或_method: GET