是否有可能限制只有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