是否可以仅限制AJAX的路由?

时间:2012-07-19 09:19:03

标签: php ajax symfony

是否可以仅为XHR请求限制Symfony 2路由?我想声明只能通过AJAX访问的路由。

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

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

我想定义:

  • AJAX请求的一条规则
  • 对同一网址的GET / POST请求的一条规则

为了解决上述情况。

6 个答案:

答案 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)

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

答案 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