Symfony Best Practice - 実践編 Chapter5-2-

前回

hanahirodev.hatenablog.com

いじった結果は随時GitHubにあげていきます。


あえて@Templateアノテーションを使ってみる

ベストプラクティスでは「使ってはいけない」とされている@Templateアノテーションをあえて使ってみる。

サンプル

なるほど。すっきりはするけど、Responseオブジェクトを返しているというよりは、arrayを返しているようにしか見えないから、「なんでこれで画面が表示されるんだろう?」となるのは理解出来る。 しかも、アノテーション(SensioFrameworkExtraBundle)のドキュメントによると、コントローラーがResponseオブジェクトを返す場合は、@Templateの設定内容が無視されるらしい。

本当かどうか、やってみた。

   // BlogController
   /**
     * @Route("/", defaults={"page": "1"}, name="blog_index")
     * @Route("/page/{page}", requirements={"page": "[1-9]\d*"}, name="blog_index_paginated")
     * @Method("GET")
     * @Cache(smaxage="10")
     * @Template("blog/index.html.twig")
     */
    public function indexAction($page)
    {
        dump($page);
        $posts = $this->getDoctrine()->getRepository(Post::class)->findLatest($page);

        return $this->render('blog/test.html.twig', ['posts' => $posts]);
//        return ['posts' => $posts];
    }

レスポンスにするテストページは以下のようにした。

{% extends 'base.html.twig' %}

{% block body_id 'blog_index' %}

{% block main %}
    <h1>This is test page</h1>
{% endblock %}

{% block sidebar %}
    {{ parent() }}

    {{ show_source_code(_self) }}
{% endblock %}

実行結果

f:id:hiroyuki-hanai:20161116014754p:plain

アノテーションよりResponseオブジェクトが優先されていることが確認できました。