20210624_Symfonyのコントローラーとルーティングについて
今日行ったこと
- Symfony入門のチャプター2
学んだこと
(1)アノテーションという仕組みでルーティング設定出来るよ!
- Railsと同じように、コントローラーだけでなく、ルーティングの設定が必要である。
config
フォルダ内のroutes.yaml
にルーティングを設定する方法のほか、さらにシンプルな方法として「アノテーション」を使った設定方法がある。(アノテーション:英語で注釈という意味💡)- アノテーションとは、@で始まるコメント文のことである。クラスやメソッドの前に記述することによって、それらに何らかの情報を付け加える働きをする。
- ここで注意なのは、ルーティング=アノテーションという訳ではなく、「アノテーション」という仕組みを使えば、「コントローラー内にルーティングを設定できる!」という選択肢の一つであること!
🌟こんな感じ! 〜省略〜 use Symfony\Component\Routing\Annotation\Route; 〜省略〜 /** * @Route("/hello", name="hello") * / public function index() 〜省略〜
- アノテーションを使うときのポイントは3つある。
- 1つ目は、
use
を使って、必要な場所を読み込んでおく必要があること。 - 2つ目は、複数行のコメント形式で表示すること。つまり冒頭に
/**
を、末尾に*/
を用意する。(コメントアウトしているのに読み込まれるの不思議〜笑) - 3つ目は、アクションメソッドの前に設定すること。つまり、ここで言えば
function index
より前にアノテーションを用意する。
❓疑問❓ useってなに?
- useキーワードといって、「このファイル限定で、指定の名前空間を参照することを設定できる機能」のこと。
- バックスラッシュで示したそれまでの階層(今回でいえば
Symfony\Component\Routing\Annotation\
)の中の、最後のクラス名の部分(今回でいえばRoute
)を「読み込んでおくれ!」とphpエンジンに指示する。
(2)大体、AbstractControllerを継承してコントローラー作るよ!
AbstractController
とは、一言でいうと「便利な機能があらかじめ組み込まれているセット」である。(現時点では想像だが、Railsで7つのアクションを利用すると、必要なHTTPメソッドが使われるようなものなのかな?と思った。)Twig
と呼ばれるテンプレートエンジンも、AbstractController
を継承することで使えるようになる。
🌟こんな感じ! 〜省略〜 use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; 〜省略〜 class HelloController extends AbstractController { 〜省略〜
(3)リクエストとレスポンスについて
ここは注意点なのかな?と思ったところだけ、ピックアップ。
- パラメータによる値の送信の時は、デフォルト値を設定しよう。なぜならば「必要な引数なしでアクセスした」と勘違いし、エラーが発生するため。
- JSON形式でレスポンスしたい時は、連想配列(キーとバリュー)としてデータを用意する。
- XMLデータの出力はちょっと面倒。なぜならば専用のResponseクラスがないので、配列をXMLデータに変換し、それをResponseでXMLとして送信するという一手間が発生するため。(そのために、コンポーネント(部品)である
Serializer
・XmlEncoder
・ObjectNormalizer
あたりを準備する。)
(4)ログ、どうやって出力するの?
- Synfonyにあらかじめ
LoggerInterface
があるので、引数で読み込み設定すればすぐ使えるよ。 - 具体的には、indexメソッドの時に使えるようにしたいのであれば、
public function index(Request $request, LoggerInterface $logger)
と宣言し、$logger->info(serialize($data));
と呼び出して、情報を書き出している。(info
は重要度の一つ。自分のみたい重要度に合わせて設定する。)
注:serializeとは、複数の要素を一列に並べる操作や処理のこと。
❓疑問❓ ->ってなに?
- アロー演算子といって、オブジェクト内のプロバティ(変数)とメソッド(関数)への道しるべ役をするもの。
- 具体的には
$logger
変数が保持するオブジェクトインスタンス内のinfo(serialize($data)
という意味になる。
感想
- 新しいこと勉強していて楽しかった。今日は集中できた。
- ついつい先延ばしにしたり、誘惑に負けそうになったりするけれど、自分にとって価値のあることに向き合えた時、終えた後に爽快感がある(笑)
- アノテーション=ルーティングだと思っていたが、アウトプットしたことによってそのインプットは間違えていると気づけた。