Symfony2でのPOSTリクエストAngularJの処理

ご注意
ずっと前に、私はハブに関する投稿を読んで、phpのコンテキストの主題について、すべての手がSymfony2に届かず、これをある種の美しい外観にすることができませんでした。


Symfony2とAngularJsを組み合わせて使用​​することは良い考えですが、1つの問題があります-すぐに使えるソリューションには通信の問題があります。 この投稿では、 symfony-json-request-transformerライブラリを使用したRequest Symfonyを使用してJSONリクエストを自動的にデコードし、受信したデータを使用する方法について説明します(実際、クラスは1つのみです)。

アイデア

AngularJs $ httpサービスは、POSTリクエストのContent-Type: application/jsonヘッダーでデータを自動的に送信し、Symfonyはapplication/x-www-form-urlencoded予期しapplication/x-www-form-urlencoded

たとえば、角度アプリケーションから簡単なJSONオブジェクトを送信しましょう。
 { "name": "John" } 

コントローラーでこのデータを取得します:
 public function postAction(Request $request) { $data = json_decode($request->getContent(), true); echo $data['name']; // John } 

かなり簡単ですね。 ただし、残念ながら、この場合、 RequestオブジェクトでParameterBagインターフェイスを使用することはできません。
nameオプションでデフォルト値がある場合、次のようなデータを受け取りたいと思います。
 $name = $request->request->get('name', 'Ivan'); 

幸いなことに、 replaceメソッドを使用して、ParameterBagのデータをデコードされたJSONに置き換えることができます。
 public function postAction(Request $request) { $data = json_decode($request->getContent(), true); $request->request->replace($data); echo $request->request->get('name', 'Ivan'); // John } 

素晴らしい、それは私たちが望んだ方法で動作します。 しかし、結局のところ、これは1つのコントローラーにすぎません...

実装

画像 ただし、各コントローラーにコードをコピーすると、 DRYの原則に違反し、コードが濡れたものになります( DRYおよびWETの略語 )。 JSONリクエストをまったく心配することなく処理できると言ったらどうでしょうか? kernel.event_listenerとしてマークされたイベントハンドラーを使用し 、次のことを行います。
  1. Content-Type: application/jsonヘッダーを確認します
  2. もしそうなら-それをデコードします
  3. Request::$requestオブジェクト
  4. 何かがうまくいかなかった場合、 HTTP 400 Bad Requestエラーコードを返しHTTP 400 Bad Request


完全なコードはGithubで見ることができます。

イベントハンドラの登録は、新しいサービスを定義するだけで非常に簡単です。
 <service id="kernel.event_listener.json_request_transformer" class="Qandidate\Common\Symfony\HttpKernel\EventListener\JsonRequestTransformerListener"> <tag name="kernel.event_listener" event="kernel.request" method="onKernelRequest" priority="100" /> </service> 

土産物店を出る

上記のコードの動作を示すために、デモアプリケーションが作成されました。そのコードはGithubにもあります。 それだけです、ご清聴ありがとうございました。

Source: https://habr.com/ru/post/J235081/


All Articles