是否可以仅针对 XHR 请求限制 Symfony 2 路由?我想声明只能通过 AJAX 访问的路由。
我不想在每个特定于 AJAX 的操作中添加一些额外的行,如下所示:
if ($request->isXmlHttpRequest()) {
// do something
} else {
// do something else
}
我想定义:
- AJAX 请求的一条规则
- 对同一 URL 的 GET/POST 请求的一条规则
为了解决上述情况。
我知道这个问题有点老,但同时在 Symfony 2.4中引入了一种新的方法来实现这一点。
对于 ajax 限制,它看起来像这样:
contact:
path: /contact
defaults: { _controller: AcmeDemoBundle:Main:contact }
condition: "request.isXmlHttpRequest()"
也可以在注释中:
/**
* ContactAction
*
* @Route("/contact", name="contact", condition="request.isXmlHttpRequest()")
*/
我的建议是定义您自己的路由器服务而不是default,它将从 扩展Symfony\Bundle\FrameworkBundle\Routing\Router
,并重新定义方法resolveParameters()并实现您自己的逻辑来处理其他要求。
然后,您可以在路由中执行以下操作:
your_route:
pattern: /somepattern
defaults: { somedefaults }
requirements:
_request_type: some_requirement
我不确定您是否可以阻止请求发生,但是您可以通过检查当前请求来检查控制器中的 XHR 请求
代码如下所示:
if ($request->isXmlHttpRequest()) {
// ...
}
这不是 100% 可靠的,其中包括浏览器不一致和代理干扰的可能性。然而,它是检查异步请求的主要方法,并且被许多人推荐。如果你是cr
网址参数
另一种方法是在您的 URL 中添加一个参数以将请求标识为异步。这是通过添加?ajax=1
到您的 URL 来实现的。然后,检查参数:
$AjaxRequest = $request->getParameter('ajax');
If($AjaxRequest == 1) {
//...
}
当然,此时您也可以创建一个特定的 Route,例如/ajax/index/
.
你不能。这不取决于您使用的是哪个框架,AJAX 请求基本上只是对服务器的请求。没有 100% 可靠的解决方案,只有“黑客”。
Symfony 路由配置中不存在您要查找的内容。
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