Symfony2 アクションでJSONを返します

Symfony2のJsonResponse と JMSSerializerBundle を使って、JSONテキストを返すアクションを作ってみます。JMSSerializerのドキュメントはこちら

セットアップ

// composer.json
{
    // ...
    require: {
        // ...
        "jms/serializer-bundle": "dev-master"
    }
}

$ php composer.phar update jms/serializer-bundle

// app/AppKernel.php
public function registerBundles()
{
    $bundles = array(
        // ...
        new JMS\SerializerBundle\JMSSerializerBundle(),
        // ...
    );

アクションの実装

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\JsonResponse;

use JMS\Serializer\SerializerBuilder;
use JMS\Serializer\Annotation as Serializer;

// JSONテキストにシリアライズしたいオブジェクト
class TinyObject
{
    /**
     * @Serializer\SerializedName(value="obj_name")
     */
    private $name;

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

    public function getName() {
        return $this->name;
    }
}

class DefaultController extends Controller
{
    public function indexAction($name)
    {
        $obj = new TinyObject($name);

        // $serializer = SerializerBuilder::create()->build();
        $serializer = $this->container->get('jms_serializer');
        $jsonContent = $serializer->serialize($obj, 'json');

        /*
         * JsonResponse のコンストラクタもsetData()もarrayを期待しているので
         * Response::setContent()で直接セットします
         */
        $response = new JsonResponse();
        $response->setContent($jsonContent);

        return $response;
    }
}

便利だなぁ。