毎度忘れるので、メモ代わりに。要するに「Symfonyマニュアルの@ParamConverter」のざっくり訳になります。
ArgumentResolverを利用する方法もあります→アクション引数でログインしているユーザーの情報を取得する
便利なアノテーション
SymfonyのControllerで使えるアノテーションに@ParamConverter
と@Entity
というのがあって、便利だなと言う話。
自動でエンティティに変換する
Symfonyの便利な機能に、ルートをアノテーション(@Route
)で指定できます。
use Symfony\Component\Routing\Annotation\Route;
class PostController
{
/**
* @Route("blog/{id}", name="post-info")
* @param Post $post
*/
public function show(Post $post) {...}
さらに便利なことに、{$id}
をプライマリキーとして使って、$post
を渡してくれます。条件は、
- ルートの中に
{id}
が存在すること。これがプライマリキーになります。 - 引数にエンティティが存在すること。
複数のエンティティがある場合
次はPost
とComment
の複数のエンティティをアノテーションで取得する方法です。これには@Entity
アノテーションを利用して、2つめのエンティティの変換方法を指定します。
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Entity;
use Symfony\Component\Routing\Annotation\Route;
class PostCommentController
{
/**
* @Route("/blog/{id}/comments/{comment_id}")
* @Entity("comment", expr="repository.find(comment_id)")
*
* @param Post $post
* @param Comment $comment
*/
public function show(Post $post , Comment $comment) {...}
@ParamConverterとは?
マニュアルのタイトルに有る@ParamConverter
とは何でしょう?
最初の自動でエンティティに変換してくれる機能について、いろいろな設定をするアノテーションと理解するのが早そうです(多分、違う…)。
例えば、{id}
ではなかったり、プライマリキーではなかったり、とかでしょうか。
/**
* @Route("/blog/{post_id}")
* @ParamConverter("post", options={"id" = "post_id"})
*/
public function showPost(Post $post) {}
毎回のように間違えるのは、複数のエンティティに変換している場合に@ParamConverter
を使おうとしても、動かないことです。この場合は@Entity
アノテーションを利用することになります。