somemo programming etc.

プログラマ、雑記、プログラミング関係はLinkから、数式はこっちでまとめていることが多い

【Symfony2】ブログ閲覧(全ページ)の作成とテスト

モデルを作成できたので、全ページの閲覧画面を作成します。

ルーティング

全ページの閲覧用のルーティングを設定します。

バンドルの登録とKernelへの登録で見た、バンドルごとのルーティングをまず変更します。MyBlogBundleをblogにします。これに対応するURLのprefixもblogにしました。

MakeGoodを利用しているので、ルーティング変更し保存するとMyBlogBundleのテストに失敗するようになりました。

ちょっと話がそれますが、DefaultControllerTest.phpURIを変更してテストが成功するようにしておきます。

$crawler = $client->request('GET', '/blog/hello/Fabien');

以下のルーティングを追加します。

blog_index:
    pattern:  /
    defaults: { _controller: "MyBlogBundle:Default:index" }

YAMLの構文として:が出現するのは正しくないので、囲みました。MyBlogBundle_homepageも同様に直しました。

全ページ閲覧の仕様

ルーティングができたところで、仕様を決定します。細かいですが、以下の仕様になると思います。

  • /blog/にアクセスすると、ブログの記事がすべて表示される
  • 記事は、htmlテーブル形式で表示する
  • 各記事は、1行で「id、タイトル、作成日時」を左から表示する
  • タイトルはリンク表示とする
  • タイトルリンク押下時、記事の詳細画面へ遷移する
  • 記事の詳細画面のURLは「/blog/{id}/show」とする
  • 作成日時のフォーマットは「YYYY/MM/DD HH:II」とする
  • 記事が1つもないときは、1行「No posts found」と表示する

全ページの取得

DoctrineからEntityManagerを取得します。EntityManagerから、リポジトリを取得します。このとき、MyBlogBundleで作成したPostエンティティを指定しています。取得したリポジトリを通して、Blogの全レコードを取得します。最後に、Twigに取得したレコードを渡しています。

詳細画面のルーティング

blog_show:
    pattern: /{id}/show
    defaults: { _controller: "MyBlogBundle:Default:show"}

Twigの修正

渡されたレコードを表示するために修正します。tableタグと、posts変数を{% for posts in post %}でまわし、{{ }}を用いて表示します。

リンクは、1系とは違いヘルパーを使わずベタhtmlです。ただし、href属性にはpath関数?を用いて、ルーティング名を変換しています。blog_showルーティングに指定するidをjson,yaml連想配列に似たものとして渡しています。

作成日時は、dateフィルターを通してフォーマットを決めています。使い方はdate関数と同じようです。

最後に、記事がなかった場合の処理を{% else %}で分岐しています。生phpでは、カウントとったりして判断しないと書けないのでとても助かります。smartyに慣れていれば、すんなり受け入れられると思います。

今回は、foreach~elseと、コメントが新たに表示されたのでTwigのテンプレートに追加しました。

テストの記述

データベースのテーブル「post」には、まだデータが格納されていないので、「No posts found」と表示されるはずです。これを確認するテストを記述します。本来であれば、Controlerおよび、Twigの修正をする前に書くべきですが、Symfony2触りたてなので徐々に行って生きたいと思います。

/**
 * 全ページ閲覧のテスト
 */
public function testIndex()
{
    $client = static::createClient();

    $crawler = $client->request('GET', '/blog/');

    $this->assertTrue($crawler->filter('html:contains("No posts found")')->count() === 1);
}

結果はグリーンとなりました。

結果

実際にroutingに記載されたURLにアクセスすると、「No posts found」と表示されています。