53

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

次のような各AJAX固有のアクションに余分な行を追加したくありません。

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

定義したい:

  • AJAXリクエストの1つのルール
  • 同じURLへのGET/POSTリクエストの1つのルール

上記のような状況を回避するために。

4

6 に答える 6

102

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

一致する式

ajax制限の場合、次のようになります。

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

注釈でも可能:

/**
 * ContactAction
 *
 * @Route("/contact", name="contact", condition="request.isXmlHttpRequest()")
 */
于 2014-02-09T16:44:44.350 に答える
10

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

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

your_route:
    pattern:  /somepattern
    defaults: { somedefaults }
    requirements:
        _request_type:  some_requirement
于 2012-07-26T06:30:10.690 に答える
3

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

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

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

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

URLパラメータ

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

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

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

于 2012-07-19T09:45:31.837 に答える
2

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

于 2012-07-27T22:31:11.657 に答える
1

探しているものがSymfonyルーティング構成に存在しません。

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

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

于 2012-07-25T14:15:29.313 に答える
0

説明された結果に到達するための要件を使用できます。
したがって、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

于 2012-07-23T07:22:56.987 に答える