シムノート

PHPフレームワークSymfonyの学習帳

ユーザ用ツール

サイト用ツール


サイドバー

メニュー



このエントリーをはてなブックマークに追加

blog:2015-12-19:sensioframeworkextrabundle

SensioFrameworkExtraBundle

SensioFrameworkExtraBundleはコントローラーを簡素にする為に、アノテーションと規約をによる機能拡張をしてくれるバンドルです。このバンドルはSymfony Standard Edition(symfony new XXXXで作成されたプロジェクト)に既に含まれています。

以下のアノテーションが使えるようになります。

使用例

@ParamConverter

    // Controller

    use AppBundle\Entity\Post;
    use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
    use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;

    //...
    
    /**
     * @Route("/{id}/edit", name="post_edit")
     * @Method({"GET", "PUT"})
     */
    public function editAction(Request $request, $id)
    {
        $repository = $this->getDoctrine()->getRepository(Post::class);
        $post = $repository->find($id);

        if (!$post) {
            throw $this->createNotFoundException('No post found for id '.$id);
        }

        // Do Something
        
        return $this->render('post/edit.html.twig', [
            'post' => $post,
        ]);        
    }

    // Controller

    use AppBundle\Entity\Post;
    use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
    use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
    use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;

    //...
    
    /**
     * @Route("/{id}/edit", name="post_edit")
     * @Method({"GET", "PUT"})
     * @ParamConverter("post", class="AppBundle:Post")
     */
    public function editAction(Request $request, $post)
    {
        // Do something
        
        return $this->render('post/edit.html.twig', [
            'post' => $post,
        ]);        
    }

@ParamConverterを使うことで、idPostの検索を行い、$post引数に渡してくれます。その際に、Postが見つからなければ、NotFoundExceptionの発行も自動で行ってくれます。コントローラーがシンプルになりました。

また、以下のように引数にタイプヒントを明記すれば、@ParamConverterを省略することも可能です。

    // Controller

    use AppBundle\Entity\Post;
    use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
    use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;

    //...
    
    /**
     * @Route("/{id}/edit", name="post_edit")
     * @Method({"GET", "PUT"})
     */
    public function editAction(Request $request, Post $post) // タイプヒントで"Post"を明記
    {
        // Do something
        
        return $this->render('post/edit.html.twig', [
            'post' => $post,
        ]);        
    }

@Template

// Controller

// ...

public function showAction($id)
{
    // get the Post
    $post = ...;

    return $this->render('AppBundle:Post:show.html.twig', [
        'post' => $post,
    ]);
}

// Controller

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;

// ...

/**
 * @Template
 */
public function showAction($id)
{
    // get the Post
    $post = ...;

    return ['post' => $post];
}

関連サイト

関連記事


Comments



99​ -11 = ?
blog/2015-12-19/sensioframeworkextrabundle.txt · 最終更新: 2016/01/04 15:11 by tsubo