web-dev-qa-db-ja.com

AJAXのみのルートを制限することは可能ですか?

XHRリクエストに対してのみSymfony 2ルートを制限することは可能ですか? AJAX経由でのみアクセス可能なルートを宣言したい。

そのような各AJAX-specific-actionsに余分な行を入れたくありません:

if ($request->isXmlHttpRequest()) {
    // do something
} else {
    // do something else
}

定義したい:

  • AJAXリクエストに対する1つのルール
  • 同じURLに対するGET/POSTリクエストの1つのルール

上記のような条件を回避するために。

48
Chris

私はこの質問が少し古いことを知っていますが、その間、これを達成するための新しい方法が導入されましたSymfony 2.4で

条件付きの完全にカスタマイズされたルートマッチング

Ajaxの制限については、次のようになります。

contact:
    path:     /contact
    defaults: { _controller: AcmeDemoBundle:Main:contact }
    condition: "request.isXmlHttpRequest()"

注釈でも可能:

/**
 * ContactAction
 *
 * @Route("/contact", name="contact", condition="request.isXmlHttpRequest()")
 */
90

私のアドバイスは、 デフォルト の代わりに独自のルーターサービスを定義することです。これはSymfony\Bundle\FrameworkBundle\Routing\Routerから拡張され、メソッド resolveParameters() を拡張して、追加要件の処理。

そして、ルーティングで次のようなことができます:

your_route:
    pattern:  /somepattern
    defaults: { somedefaults }
    requirements:
        _request_type:  some_requirement
10
Vitalii Zurian

リクエストの発生を防止できるかどうかはわかりませんが、現在のリクエストを確認することで、コントローラーでXHRリクエストを確認できます

コードは次のようになります。

if ($request->isXmlHttpRequest()) {
    // ...
}

これは、特にブラウザの不整合やプロキシ干渉の可能性があるため、100%信頼できるものではありません。ただし、非同期要求をチェックする主要な方法であり、多くの人が推奨しています。あなたがcrなら

RLパラメーター

別の方法として、URLにパラメーターを追加して、要求を非同期として識別します。これは、?ajax=1をURLに追加します。次に、以下を使用してパラメーターを確認します。

$AjaxRequest = $request->getParameter('ajax');
If($AjaxRequest == 1) {
    //...
}

もちろん、この時点で特定のルートを作成することもできます。 /ajax/index/

3
Rich

いいえ、あなたがすることはできません。使用しているフレームワークに依存しません。AJAXリクエストは基本的にサーバーへの単なるリクエストです。100%信頼できるソリューションはなく、「ハッキング」です。

2
dmirkitanov

お探しのものはSymfonyルーティング設定には存在しません。

Request :: isXmlHttpRequestは100%信頼できるものではなく、JavaScriptライブラリによって書き込まれたHTTPヘッダーをチェックします。

JavaScriptライブラリがX-Requested-With HTTPヘッダーを設定している場合に機能します。 Prototype、Mootools、jQueryで動作することが知られています。

1
AlterPHP

説明された結果に到達するには、 要件 を使用できます。
そのため、ルートをyml形式に定義しているとすると、このようなことをしなければなりません

my_route:
  pattern:  /path/to/route
  defaults: { _controller: CompanyBundle:Controller:Action, _format: html }
  requirements:
      _format:  xmlhttp /* not sure about the correct format because
                           i've never checked about */

そしてもちろん、_method: POSTまたは_method: GET

0
DonCallisto