是否有可能限制只有AJAX的路线?

是否有可能限制一个Symfony 2路线的XHR请求只? 我想声明只能通过AJAX访问的路由。

我不想在每个特定于AJAX的操作中添加一些额外的行:

if ($request->isXmlHttpRequest()) { // do something } else { // do something else } 

我想定义:

  • AJAX请求的一个规则
  • GET / POST请求到同一个URL的一个规则

为了解决像上面这样的条件。

我知道这个问题有点老,但同时在Symfony 2.4中引入一个新的实现方法

完全自定义的路线匹配与条件

对于ajax限制,它看起来像这样:

 contact: path: /contact defaults: { _controller: AcmeDemoBundle:Main:contact } condition: "request.isXmlHttpRequest()" 

也可以在注释中:

 /** * ContactAction * * @Route("/contact", name="contact", condition="request.isXmlHttpRequest()") */ 

我的build议是定义自己的路由器服务,而不是默认的 ,这将从Symfony\Bundle\FrameworkBundle\Routing\Router扩展,并重新定义方法resolveParameters() ,实现自己的逻辑来处理额外的需求。

然后,你可以在你的路由中做这样的事情:

 your_route: pattern: /somepattern defaults: { somedefaults } requirements: _request_type: some_requirement 

我不确定您是否可以阻止请求发生,但您可以通过检查当前请求来检查控制器中的XHR请求

代码看起来像这样:

 if ($request->isXmlHttpRequest()) { // ... } 

这不是100%可靠的,这是因为浏览器不一致以及代理干扰的可能性。 然而,它是检查asynchronous请求的主要方法,并被许多人推荐。 如果你是cr

url参数

另一种方法是在您的URL中添加一个参数,以将请求标识为asynchronous。 这可以通过在URL中添加?ajax=1来实现。 然后,检查参数:

 $AjaxRequest = $request->getParameter('ajax'); If($AjaxRequest == 1) { //... } 

当然,在这一点上,你也可以创build一个特定的路线eg /ajax/index/

你不能。 它不取决于你使用的是哪个框架,AJAX请求基本上只是对服务器的请求。 没有100%可靠的解决scheme,只是“黑客”。

Symfony路由configuration中不存在您正在寻找的内容。

Request :: isXmlHttpRequest甚至不是100%可靠的,并检查你的JavaScript库放置的HTTP头:

如果您的JavaScript库设置了X-Requested-With HTTP标头,它将起作用。 已知与Prototype,Mootools,jQuery一起工作。

您可以使用这些要求来达到所描述的结果。
所以,假设你将路线定义为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