Symfony2,检查ajax是否调用了一个动作

时间:2014-05-28 12:45:09

标签: ajax symfony controller

我需要,对于我的控制器中的每个操作,检查这些操作是否被ajax请求调用。

如果是,则不附加任何内容,如果不是,我需要重定向到主页。

我刚刚找到if($this->getRequest()->isXmlHttpRequest()),但我需要在每个操作上添加此验证。

你知道更好的方法吗?

3 个答案:

答案 0 :(得分:57)

这很容易!

只需将$ request变量添加到您的方法中即可使用。 (对于每个控制器)

<?php
namespace YOUR\Bundle\Namespace

use Symfony\Component\HttpFoundation\Request;

class SliderController extends Controller
{

    public function someAction(Request $request)
    {
        if($request->isXmlHttpRequest()) {
            // Do something...
        } else {
            return $this->redirect($this->generateUrl('your_route'));
        }
    }

}

如果要自动执行此操作,则必须定义内核请求侦听器。

答案 1 :(得分:6)

对于可重用的技术,我使用基本模板中的以下内容

{# app/Resources/views/layout.html.twig #}
{% extends app.request.xmlHttpRequest 
     ? '::ajax-layout.html.twig'
     : '::full-layout.html.twig' %}

因此,当源自Ajax时,所有扩展layout.html.twig的模板都会被自动剥离所有标准标记。

Source

答案 2 :(得分:2)

首先,请注意不推荐使用getRequest(),因此请通过操作方法中的参数获取请求。

如果您不想使用附加代码来规划控制器类,则解决方案是编写一个事件监听器,这是一种服务。

您可以这样定义:

services:
    acme.request.listener:
        class: Acme\Bundle\NewBundle\EventListener\RequestListener
        arguments: [@request_stack]
        tags:
            - { name: kernel.event_listener, event: kernel.request, method: onRequestAction }

然后在RequestListener类中,创建一个onRequestAction()方法并通过constrcutor注入请求堆栈。在onRequestAction()中,您可以获得如下控制器名称:

$this->requestStack->getCurrentRequest()->get('_controller');

它将返回控制器名称和操作(我认为它们以:)分隔。解析字符串并检查它是否是正确的控制器。如果是,也检查它是XmlHttpRequest,如下所示:

$this->requestStack->getCurrentRequest()->isXmlHttpRequest();

如果不是,您可以重定向/转发。

另请注意,每次请求都会检查此项。如果您直接在其中一个控制器中检查这些内容,您将获得更轻量级的解决方案。