ご注意
ずっと前に、私はハブに関する投稿を読んで、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
としてマークされたイベントハンドラーを使用して 、次のことを行います。
-
Content-Type: application/json
ヘッダーを確認します - もしそうなら-それをデコードします
-
Request::$request
オブジェクト - 何かがうまくいかなかった場合、
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>