web-dev-qa-db-ja.com

symfony2、アクションがajaxによって呼び出されるかどうかを確認します

コントローラーのアクションごとに、これらのアクションがajaxリクエストによって呼び出されるかどうかを確認する必要があります。

「はい」の場合、何も追加せず、「いいえ」の場合、ホームページにリダイレクトする必要があります。

if($this->getRequest()->isXmlHttpRequest())を見つけましたが、アクションごとにこの検証を追加する必要があります。

もっと良い方法を知っていますか?

27

それは非常に簡単です!

メソッドに$ 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'));
        }
    }

}

これを自動的に行うには、カーネルリクエストリスナーを定義する必要があります。

58

再利用可能な手法については、基本テンプレートから次を使用します

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

したがって、テンプレートを拡張するすべてのlayout.html.twigは、Ajaxから発信された場合、すべての標準マークアップを自動的に削除できます。

ソース

7

まず、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();

そうでない場合は、リダイレクト/転送できます。

また、これはすべてのリクエストでチェックされることに注意してください。コントローラーの1つでこれらのことを直接チェックすると、より軽量なソリューションになります。

2
tomazahlin