はじめに
PHPフレームワークであるSymfonyを用いて開発を行っているとき、@Routeというアノテーションが記載されていたため、これは何だと思い調べたものをまとめておきます
/**
* @Route(
* "/user/buy/item",
* name="hogepage",
* methods={"POST"}
* )
*
* @param Request $request
*/
public function hogehoge(Request $request)
{
@Route(ルートアノテーション)とは
@Routeとは
・「このメソッドに対して、どの URL に、どの HTTP メソッドでアクセスできるか」
・「このルートの名前は何か(他の場所から参照するためのID)」
を指すものになります。
上記の例では
- URL:
/user/buy/item - ルート名:
hoge_page - HTTPメソッド:
POST
でアクセスされたときに、このメソッドが呼ばれます。
もし GET でアクセスが来た場合は「このルートは対象外」とみなされ、404 や 405 になります。
methods={"GET", "POST"}と記述すると両方対応できます。
ルート名は「内部用の名前」のことです。
URLを生成したい時、パスを書き込まなくてもルート名から生成を行うことが出来ます。
// URL生成
$url = $this->generateUrl('hoge_page');
// Twigテンプレート
<a href="{{ path('hoge_page') }}">商品ページへ</a>
内部(コントローラやテンプレート)からならルート名を利用することはできますが、
外部(ブラウザ・APIクライアント)からはルート名は利用することが出来ないので注意しましょう。
@Routeが呼び出される流れ
正確には @Route 自体が『呼び出される』わけではなく、@Route で設定されたルート情報に基づいて、対応するコントローラメソッドが呼ばれるイメージです。
それでは流れを紹介します。
コントローラー → @Route
-
やること:
redirectToRoute('ルート名')generateUrl('ルート名')
-
動き:
- ルート名 → URL を生成
- ブラウザをその URL へリダイレクト
- 結果として、そのルートのメソッドが実行される
テンプレート(Twig) → @Route
-
やること:
{{ path('ルート名') }}{{ url('ルート名') }}
-
動き:
- ルート名 → URL を生成
- HTML の
hrefやactionに URL が埋め込まれる - ユーザー操作やフォーム送信でその URL が叩かれる
- 結果として、そのルートのメソッドが実行される
外部(ブラウザ / JS / 他サービス) → @Route
-
やること:
- 素の URL(例:
/something/...)を叩く
- 素の URL(例:
-
動き:
- Symfony がルーティングテーブルから、URL + HTTP メソッドにマッチするルートを探す
- 対応するメソッド(コントローラーメソッド)を実行する
最後に
フレームワークでは大体、
1.ルーティング設定(@Route アノテーションや、routes.yaml など)をあらかじめ読み込む
2.リクエストが来たら、URL と HTTPメソッドを見て、どのルートにマッチするかを探す
3.マッチしたルートに紐づいているコントローラメソッドを呼び出す
4.そのメソッドの戻り値(Response)をクライアントに返す
という流れで動きます。
@Routeを利用することによって、どのメソッドがどの URL に対応しているかが、その場でわかりやすくなります。また、ルート名から URL を生成できるので、URLの変更が楽になります。
ぜひSymfonyを利用する際は@Route アノテーションを利用して、ルーティング設定をしてみてください。