Symfony2 JSONリクエストを受け取ります

JSONテキストでPOSTされてきたデータを処理するアクションを作ってみます。

JSONをデシリアライズして得たいオブジェクト

class AcceptedObject
{
    /**
     * @Serializer\Type("integer")
     */
    private $id;

    /**
     * @Serializer\Type("string")
     */
    private $name;

    public function setId($id)
    {
        $this->id = $id;
    }

    public function setName($name)
    {
        $this->name = $name;
    }
}

アクションの実装

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use JMS\Serializer\Annotation as Serializer;

class AcceptJsonController extends Controller
{
    public function indexAction(Request $request)
    {
        $contentType = $request->headers->get('Content-Type');
        $content = $request->getContent();

        if (strcasecmp($contentType, 'application/json') === 0) {
            if ($content) {
                $serializer = $this->container->get('jms_serializer');
                $data = $serializer->deserialize($content, '...\AcceptedObject', 'json');

                return new Response(print_r($data, true));
            }
        }

        return new Response("invalid.");
    }
}

リクエストとレスポンスの例

$ curl http://localhost/Xxxx/web/app_dev.php/json/ -d '{"id":123, "name":"Your Name"}' -H 'content-Type: application/json'
...\AcceptedObject Object
(
    [id:...\AcceptedObject:private] => 123
    [name:...\AcceptedObject:private] => Your Name
)

便利ですねー。
あ、キャッシュが悪さする場合があるみたいです。