シムノート

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

ユーザ用ツール

サイト用ツール


サイドバー

メニュー



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

blog:2015-12-08:超入門_symfony3_controllerとrouting

超入門 Symfony3 : (4) ControllerとRouting

だいぶ前置きが長くなりましたが、ここからプログラミングしていきます。ディレクトリ構成MVCパターンという地図をもって、Symfonyの世界を旅しましょう。

はじめてのページ表示

OmikujiControllerを追加してみましょう。利用者がおみくじで運勢を占うページを表示します。

<?php

namespace AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;   // (a)
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; // (b)
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class OmikujiController extends Controller  // ①
{
    /**
     * おみくじ運勢を表示する
     * 
     * @Route("/omikuji", name="omikuji")  // ②
     * 
     * @param Request $request
     * @return Response
     */
    public function omikujiAction(Request $request)  // ③
    {
        $omikuji = ['大吉', '中吉', '小吉', '末吉', '凶'];
        $number = rand(0, count($omikuji) - 1);

        return new Response(  // ④
            "<html><body>あなたの運勢は $omikuji[$number] です。</body></html>"
        );
    }
}

① コントローラーは(a)のControllerクラスを継承して定義します。

② omikujiActionメソッドのコメントブロックに@XXXXで情報を付加している部分をアノテーションと言います。@Routeはルートを定義します。URLの"/omikuji"パスにアクセスがあった時にomikujiActionメソッドを実行するよう定義しています。name="omikuji"と指定している部分は、ここで定義したルートに名前を付けています。このルート名はルート名からURLを生成する時に使います。
※ なお、@Routeを使うには(b)のuse文でのインポートが必要ですのでお忘れなく。

@Routeアノテーションを使って、ルーティングを定義します。
ルーティングはURLに対して、実行するアクションを指定します。

③ ルーティングされたメソッドの事をアクションと言い、メソッド名はxxxxActionとします。アクションはクライアントからの入力であるRequestを引数に受け取ります。特にクライアントからの入力データがない場合は、Request引数を省略することもできます。

④ クライアントにResponseを返しています。ここではHTML文字列をResponseにセットして返しています。

コントローラーはRequestを受け取り、Responseを返します。

ここで動作確認を行います。http://localhost:8000/omikuji にブラウザでアクセスすると、運勢が表示されます。

ルートパラメータ

先ほどのおみくじ占いを、URLから利用者の名前を受けられるように修正します。

class OmikujiController extends Controller
{
    /**
     * おみくじ運勢を表示する
     *
     * // ①
     * @Route("/omikuji/{yourname}", defaults={"yourname" = "YOU"}, name="omikuji")
     * 
     * @param Request $request
     * @return Response
     */
    public function omikujiAction(Request $request, $yourname)  // ②
    {
        $omikuji = ['大吉', '中吉', '小吉', '末吉', '凶'];
        $number = rand(0, count($omikuji) - 1);

        return new Response(  // ③
            "<html><body>{$yourname}さんの運勢は $omikuji[$number] です。</body></html>"
        );
    }
}

① URLの最後の部分に{yourname}(ルートパラメータ)を追加します。このルートパラメータが動的な値を受け取れる箇所になります。defaults={"yourname" = "YOU"}はルートパラメータが指定されなかった時のデフォルト値を設定しています。

② アクションメソッドはルートパラメータの値を引数で受け取ることができます。ルートパラメータ名と引数の変数名を合わせる必要があります。

③ $yournameで受け取った名前を表示するように修正します。

URLにルートパラメータを定義することで、アクションに動的な値を渡すことができます。

http://localhost:8000/omikuji/GOROMARU にアクセスして動作確認を行います。「GOROMARUさんの運勢は XX」と表示されます。

ルート一覧

php bin/console debug:router を使うと、現在定義されている全てのルートが確認できます。

$ php bin/console debug:router --show-controllers
 ------------------ -------- -------- ------ --------------------- --------------------------- 
  Name               Method   Scheme   Host   Path                  Controller                 
 ------------------ -------- -------- ------ --------------------- --------------------------- 
  ...
  homepage           ANY      ANY      ANY    /                     AppBundle:Default:index    
  omikuji            ANY      ANY      ANY    /omikuji/{yourname}   AppBundle:Omikuji:omikuji  
 ------------------ -------- -------- ------ --------------------- --------------------------- 

コラム:アノテーションとは

アノテーションとはコメント内に@XXXXで情報を付与する手法のことです。

@RouteSymfonyが参照するルーティングを定義することは述べましたが、@param@returnは何でしょうか? これらは、PHPのドキュメント生成ツールが参照し、クラスやメソッドの仕様書を生成する為に使います。 その他に、IDEも参照していて、入力補完に使用されています。

アノテーションはPHPの言語仕様では無いため、コメント内に記述します。Symfonyだけが使っている訳ではなく様々なツールが様々な用途で使用しています。


Comments



109 +0 = ?
blog/2015-12-08/超入門_symfony3_controllerとrouting.txt · 最終更新: 2015/12/14 18:39 by tsubo