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

Symfony2,检查一个动作是否由ajax调用,ajax,symfony,controller,Ajax,Symfony,Controller,对于控制器中的每个动作,我需要检查这些动作是否由ajax请求调用 如果是,没有附加任何内容,如果不是,我需要重定向到主页 我刚刚找到了if($this->getRequest()->isXmlHttpRequest()),但我需要在每个操作上添加此验证 您知道更好的方法吗?首先,请注意getRequest()已被弃用,因此请通过操作方法中的参数获取请求 若您不想用额外的代码来处理控制器类,一个解决方案是编写一个事件侦听器,它是一个服务 您可以这样定义它: services: acme.r

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

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

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


您知道更好的方法吗?

首先,请注意getRequest()已被弃用,因此请通过操作方法中的参数获取请求

若您不想用额外的代码来处理控制器类,一个解决方案是编写一个事件侦听器,它是一个服务

您可以这样定义它:

services:
    acme.request.listener:
        class: Acme\Bundle\NewBundle\EventListener\RequestListener
        arguments: [@request_stack]
        tags:
            - { name: kernel.event_listener, event: kernel.request, method: onRequestAction }
$this->requestStack->getCurrentRequest()->get('_controller');
$this->requestStack->getCurrentRequest()->isXmlHttpRequest();
然后在RequestListener类中,生成一个onRequestAction()方法,并通过构造函数注入请求堆栈。在onRequestAction()中,可以获得如下控制器名称:

services:
    acme.request.listener:
        class: Acme\Bundle\NewBundle\EventListener\RequestListener
        arguments: [@request_stack]
        tags:
            - { name: kernel.event_listener, event: kernel.request, method: onRequestAction }
$this->requestStack->getCurrentRequest()->get('_controller');
$this->requestStack->getCurrentRequest()->isXmlHttpRequest();
它将返回控制器名称和操作(我认为它们之间用:)分隔。解析字符串并检查它是否是正确的控制器。如果是,请检查它是否为XmlHttpRequest,如下所示:

services:
    acme.request.listener:
        class: Acme\Bundle\NewBundle\EventListener\RequestListener
        arguments: [@request_stack]
        tags:
            - { name: kernel.event_listener, event: kernel.request, method: onRequestAction }
$this->requestStack->getCurrentRequest()->get('_controller');
$this->requestStack->getCurrentRequest()->isXmlHttpRequest();
如果不是,则可以重定向/转发

还请注意,这将在每次请求时进行检查。如果您直接在一个控制器中检查这些内容,您将得到一个更轻的解决方案。

这非常简单

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

redirect($this->generateUrl('your_route'));
}
}
}

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

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

{#app/Resources/views/layout.html.twig}
{%extends app.request.xmlHttpRequest
?'::ajax layout.html.twig'
:'::完整布局.html.twig%}
因此,当源于Ajax时,所有扩展
layout.html.twig
的模板都可以自动删除所有标准标记


好主意,很聪明。我喜欢:3我说同样的、好的、聪明的主意;-)