XHRリクエストに対してのみSymfony 2ルートを制限することは可能ですか? AJAX経由でのみアクセス可能なルートを宣言したい。
そのような各AJAX-specific-actionsに余分な行を入れたくありません:
if ($request->isXmlHttpRequest()) {
// do something
} else {
// do something else
}
定義したい:
上記のような条件を回避するために。
私はこの質問が少し古いことを知っていますが、その間、これを達成するための新しい方法が導入されましたSymfony 2.4で。
Ajaxの制限については、次のようになります。
contact:
path: /contact
defaults: { _controller: AcmeDemoBundle:Main:contact }
condition: "request.isXmlHttpRequest()"
注釈でも可能:
/**
* ContactAction
*
* @Route("/contact", name="contact", condition="request.isXmlHttpRequest()")
*/
私のアドバイスは、 デフォルト の代わりに独自のルーターサービスを定義することです。これはSymfony\Bundle\FrameworkBundle\Routing\Router
から拡張され、メソッド resolveParameters() を拡張して、追加要件の処理。
そして、ルーティングで次のようなことができます:
your_route:
pattern: /somepattern
defaults: { somedefaults }
requirements:
_request_type: some_requirement
リクエストの発生を防止できるかどうかはわかりませんが、現在のリクエストを確認することで、コントローラーでXHRリクエストを確認できます
コードは次のようになります。
if ($request->isXmlHttpRequest()) {
// ...
}
これは、特にブラウザの不整合やプロキシ干渉の可能性があるため、100%信頼できるものではありません。ただし、非同期要求をチェックする主要な方法であり、多くの人が推奨しています。あなたがcrなら
RLパラメーター
別の方法として、URLにパラメーターを追加して、要求を非同期として識別します。これは、?ajax=1
をURLに追加します。次に、以下を使用してパラメーターを確認します。
$AjaxRequest = $request->getParameter('ajax');
If($AjaxRequest == 1) {
//...
}
もちろん、この時点で特定のルートを作成することもできます。 /ajax/index/
。
いいえ、あなたがすることはできません。使用しているフレームワークに依存しません。AJAXリクエストは基本的にサーバーへの単なるリクエストです。100%信頼できるソリューションはなく、「ハッキング」です。
お探しのものはSymfonyルーティング設定には存在しません。
Request :: isXmlHttpRequestは100%信頼できるものではなく、JavaScriptライブラリによって書き込まれたHTTPヘッダーをチェックします。
JavaScriptライブラリがX-Requested-With HTTPヘッダーを設定している場合に機能します。 Prototype、Mootools、jQueryで動作することが知られています。
説明された結果に到達するには、 要件 を使用できます。
そのため、ルートを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