Symfony2,检查一个动作是不是被ajax调用

Posted

技术标签:

【中文标题】Symfony2,检查一个动作是不是被ajax调用【英文标题】:Symfony2, check if an action is called by ajax or notSymfony2,检查一个动作是否被ajax调用 【发布时间】:2014-05-28 12:45:09 【问题描述】:

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

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

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

你知道更好的方法吗?

【问题讨论】:

【参考方案1】:

很简单!

只需将 $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'));
        
    


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

【讨论】:

【参考方案2】:

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

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

因此,所有扩展 layout.html.twig 的模板在源自 Ajax 时都可以自动去除所有标准标记。

Source

【讨论】:

好主意。我喜欢它:3 我也是这么说的,不错,聪明的主意 ;-)【参考方案3】:

首先,请注意 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()方法,通过构造函数注入请求栈。在 onRequestAction() 中,您可以像这样获取控制器名称:

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

它将返回控制器名称和操作(我认为它们是用:) 分隔的。解析字符串并检查它是否是正确的控制器。如果是,还要检查它是不是这样的 XmlHttpRequest:

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

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

另请注意,这将在每个请求时进行检查。如果您直接在其中一个控制器中检查这些内容,您将拥有一个更轻量级的解决方案。

【讨论】:

以上是关于Symfony2,检查一个动作是不是被ajax调用的主要内容,如果未能解决你的问题,请参考以下文章

通过 AJAX 调用创建后 Symfony 2 会话不持久

Vue 检查动作是不是使用 spyOn 调用其他动作

如何检查请求是不是是 Symfony2 或 Symfony3 中的 POST 或 GET 请求

symfony2 上的 AJAX 跨域

Symfony2 在 AJAX 调用中返回空 JSON,而变量不为空

Symfony2 - KnpPaginator - AJAX/嵌入式控制器