2019/09/26
Symfonyルーティングの仕組み
Symfonyでルーティングの仕組みを調べました。
Symfonyにはルーティングの方法がいくつかあります。
その中で今回はyamlでルーティングを指定するやり方、annotationで指定するやり方の二つを紹介します。
なお、Symfonyのバージョンは4.3です。
yamlで指定する
まずはyamlで指定する方法です。
symfonyのルーティングの中で最もポピュラーな方法かなと思います。
symfonyプロジェクトを開き、config\routes.yamlを開いてください。
デフォルトの状態だと以下のようになっているはずです。
#index:
# path: /
# controller: App\Controller\DefaultController::index
コメントアウトされていますが、/
(つまりホームページ!)にアクセスした場合、DefaultController
のindex
メソッドを実行するということを表しています。
このyamlファイルを以下のように変更してみます。
index:
path: /
controller: App\Controller\TestController::test
Controllerは以下のように定義します。
<?php
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
class TestController
{
public function test()
{
return new Response('testメソッドが実行されました');
}
}
サーバを起動し、実際にアクセスしてみると以下のような表示になると思います。
スラグを設定する
スラグの設定方法は実に簡単です。
まずはroutes.yaml
を以下のように変更します。
index:
path: test/{slug}
controller: App\Controller\TestController::test
次にtest
メソッドもスラグから渡ってきた値を受け取ることができるように修正します。
public function test($slug)
{
return new Response("${slug}がスラグに指定されました");
}
この状態でtest/hoge
やtest/huga
などにアクセスすると、表示が変わることがわかると思います。
annotationで指定する
annotationで指定する方法も、基本的にはyamlで指定する方法と変わりません。
まずは追加でannotations
をインストールします。
$ composer require annotations
annotationを使用するためには以下をuseした状態で
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
呼び出したいメソッドの上部に、以下の記述を追加します。
/**
* @Route("/")
*/
ソースコードは以下のようになります。
<?php
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
class TestController
{
/**
* @Route("/")
*/
public function test()
{
return new Response("annotationを使用しました。");
}
}
/
にアクセスすると、無事表示されると思います。
スラグを設定したい場合は以下のようにします。
/**
* @Route("/test/{slug}")
*/
public function test($slug)
{
return new Response("${slug}がスラグに指定されました");
}