53

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

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

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

我想定义:

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

为了解决上述情况。

4

6 回答 6

102

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

匹配表达式

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

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

也可以在注释中:

/**
 * ContactAction
 *
 * @Route("/contact", name="contact", condition="request.isXmlHttpRequest()")
 */
于 2014-02-09T16:44:44.350 回答
10

我的建议是定义您自己的路由器服务而不是default,它将从 扩展Symfony\Bundle\FrameworkBundle\Routing\Router,并重新定义方法resolveParameters()并实现您自己的逻辑来处理其他要求。

然后,您可以在路由中执行以下操作:

your_route:
    pattern:  /somepattern
    defaults: { somedefaults }
    requirements:
        _request_type:  some_requirement
于 2012-07-26T06:30:10.690 回答
3

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

代码如下所示:

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

这不是 100% 可靠的,其中包括浏览器不一致和代理干扰的可能性。然而,它是检查异步请求的主要方法,并且被许多人推荐。如果你是cr

网址参数

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

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

当然,此时您也可以创建一个特定的 Route,例如/ajax/index/.

于 2012-07-19T09:45:31.837 回答
2

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

于 2012-07-27T22:31:11.657 回答
1

Symfony 路由配置中不存在您要查找的内容。

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

如果您的 JavaScript 库设置了 X-Requested-With HTTP 标头,它就可以工作。众所周知,它可以与 Prototype、Mootools、jQuery 一起使用。

于 2012-07-25T14:15:29.313 回答
0

您可以使用要求来达到描述的结果。
所以,假设你正在定义 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

于 2012-07-23T07:22:56.987 回答