将路由限制为Ajax调用,可以在Symfony 2.6+中使用吗?

Rey*_*rPM 2 php ajax jquery symfony symfony-routing

我正在寻找实现Ajax调用的"自动"路由限制的最佳方法.现在我做的如下:

/**
 * @Secure(roles="IS_AUTHENTICATED_FULLY")
 * @Route("/someRoute", name="someRoute")
 * @Method("POST")
 */
public function eliminarFacturasAction(Request $request)
{
    $response['success'] = false;
    $status              = 400;

    if ($request->isXmlHttpRequest()) {
        // needs to set $response values and $status=200 all the time
    } else {
        // needs to handle the exception and return Json response
    }

    return new JsonResponse($response, $status ?: 200);
}
Run Code Online (Sandbox Code Playgroud)

为了避免这种情况,我可以使用它吗?

 @Route("/someRoute", 
           name="routeName", 
           condition="request.headers.get('X-Requested-With') == 'XMLHttpRequest'"
 )
Run Code Online (Sandbox Code Playgroud)

我使用jQuery作为JS框架所以XMLHttpRequest不会成为一个问题.如果没有通过Ajax调用执行路由,将触发什么样的异常?我可以抓住它并向用户显示消息吗?或者显示某种404页面?

我在这里发现了一个类似的问题,但对我来说根本不清楚

Ger*_*rry 5

你可以在kernel.request监听器中这样做.

class DisallowNonXmlHttpRequestListener
{
    public function checkRequest(GetResponseEvent $event)
    {
        if (!$event->getRequest()->isXmlHttpRequest()) {
            throw new AccessDeniedHttpException();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并在您的服务配置:

services:
    disallow_non_xml_http_request_listener:
        class: DisallowNonXmlHttpRequestListener
        tags: [{ name: kernel.event_listener, event: kernel.request, method: checkRequest }]
Run Code Online (Sandbox Code Playgroud)