簡體   English   中英

Symfony2,檢查一個動作是否被 ajax 調用

[英]Symfony2, check if an action is called by ajax or not

我需要,對於控制器中的每個操作,檢查這些操作是否由 ajax 請求調用。

如果是,則不附加任何內容,如果否,我需要重定向到主頁。

我剛剛找到if($this->getRequest()->isXmlHttpRequest()) ,但我需要在每個動作上添加此驗證..

你知道更好的方法嗎?

這很容易!

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

}

如果要自動執行此操作,則必須定義內核請求偵聽器。

對於可重用的技術,我使用基本模板中的以下內容

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

因此,當源自 Ajax 時,所有擴展layout.html.twig的模板都可以自動剝離所有標准標記。

來源

首先,請注意 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();

如果不是,您可以重定向/轉發。

另請注意,這將在每個請求時進行檢查。 如果您直接在其中一個控制器中檢查這些內容,您將擁有一個更輕量級的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM