Laravel4のjson系メソッドで取り込めない場合

タグ: Laravel4   AWS  

LaravelではJSON形式のデーターが簡単に取り扱えるように、サポートされています。

先日、AWSのSNSをLaravelから使用した時に、まる一日はまったのが、Input::json()で取り込めないことでした。なにせ、SNSを本格使用するのは初めてなので、原因を追求するとき、遠回りをしてしまいました。

LaravelのInput::json()では、コンテンツタイプがplain/jsonかどうかのチェックがあります。SNSからのJSONリクエストは、plain/textのため、チェックで弾かれ、空配列が戻ってきていました。(多分、Laravelのチェックが厳密すぎるのでしょう。)

こういう時は、リクエストの本文を直接取り込めるRequest::getContent()が使用できます。

$result = json_decode( Request::getContent(), true );

SNSは他のサービスやこちらから送った内容(メッセージ)を指定場所へ通知してくれる仕組みです。今回は、SESのバウンスメールの通知を転送するために使用しました。SNSのJSON形式に含まれている、Messageアイテムから、SESが通知してきたJSON形式のメッセージを再度取り出す必要がありました。

$message = json_decode( array_get( $result, 'Message' ), true );

分かってしまえば、なんてこと無いんですが、SNSやLaravel内部の実装は、できればブラックボックスのまま使用したいもので、先に調べていませんでした。(正確に言えば、簡単には見つからないため、諦めていました。)