【Symfony2.3】ParamConverterがくっそ便利な件。

これ使うとコントローラーをかなり圧縮できる。

例)

namespace Hoge\FugaBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;

// 例えばFOSRestBundleを道入してRestAPIを作成していたとする。
use FOS\RestBundle\Controller\Annotations\View;

class PiyoController extends Controller
{
    /**
     * @Route("/user/{id}.{_format}", name="hoge_fuga_piyo_show", defaults={"_format" = "json"})
     * @View(serializerEnableMaxDepthChecks=true, serializerGroups={"piyoShow"})
     * @ParamConverter("entity", class="HogeFugaBundle:User")
     * @Method("GET")
     */
    public function showAction(User $entity)
    {
        return $entity;
    }

}

見て分かる通り、URLよりIDを取得後対応するエンティティをjson文字列として返却するメソッドは上記の通り1行で済むようになる。

アノテーションでParamConverterを指定してやると、自動でDoctrineから習得したエンティティを注入してくれているのである。

基本的に指定がなければリポジトリのfind()メソッドにRouteアノテーションから受け取ったidを渡してエンティティ習得を試みてくれるが、リポジトリ内のメソッドを指定することも出来る

/**
 * @ParamConverter("entity", class="HogeFugaBundle:User", options={"repository_method"="customGet"})
 */

といった具合である。

更に便利な機能もあるのであとは公式を参照されたし。

http://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/converters.html

これはまじで便利。