我是Symfony 2的新手。我正在使用Symfony 2.3。
我正在为我的路线使用yml文件。我希望某个路由仅限于Ajax调用。我怎样才能做到这一点?我找到了一个类似的question,但它建议的解决方案是针对Symfony 2.4
所以请帮助我如何实现它。
目前我已经在我的控制器ajax动作中编写了条件代码,如下所示,但我不知道如果对该路由的调用不是通过Ajax,如何处理。
if ($request->isXmlHttpRequest()) {
// Some operations
// Prepare the data array based on the Ajax request.
}
return $this->render('AcmeBundle:Ajax:index.html.twig', array('data' => $data));
我希望只能使用Ajax访问此路由,否则它应该抛出一些异常,例如无效路由或重定向到其他页面。
提前致谢。
答案 0 :(得分:2)
我在symfony 2.3中不知道这种方式,但在版本2.4中,以下路由配置可用于识别ajax请求。
ajax_route:
path: /your-ajax-route
defaults: { _controller: AcmeBundle:Ajax:index }
condition: "request.isXmlHttpRequest()"
路由的注释版本也可以像下面这样使用:
/**
* IndexAction
*
* @Route("/your-ajax-route/", name="ajax_route", condition="request.isXmlHttpRequest()")
*/
以上所有内容只是了解ajax请求的临时解决方案,否则可以操纵标头,并且您永远无法识别请求是否为xmlhttp。没有100%可靠的方法来检查xml http请求。
答案 1 :(得分:1)
首先,可以操纵标题。所以带有一堆标题的curl请求可以提取ajax请求。我相信你可以用Symfony 2.3检查标题
use Symfony\Component\HttpFoundation\Request;
$request = Request::createFromGlobals();
$ajax = $request->headers->get('HTTP_X_REQUESTED_WITH');
if($ajax != 'xmlhttprequest'){
throw new \Exception("This is not an ajax request");
}
或者您可以使用$_SERVER['HTTP_X_REQUESTED_WITH'] == "xmlhttprequest"