Symfonyチュートリアル:(2回目)コントローラーの作成

2回目なので、さくさく進んだところも多かったです。

ローカルのWebサーバーの起動

symfony CLIコマンドは、開発用に最適化されたWebサーバーとしても機能する。
Symfonyとうまく連携してくれるが、開発用としての使用のみで、決して本番環境では使用してはいけない(公式サイトより)。

プロジェクトのディレクトリからバックグラウンドでWebサーバを動かしてみる。

$ symfony server:start -d

サーバは 8000 番からはじまる使用可能なポートで立ち上がります。ショートカットを使用して、 CLI からブラウザでwebサイトを開いてみましょう:

ゼロの状態からプロダクションまでやってみよう (Symfony 5.4 Docs)
$ symfony open:local

無事ページが表示されました。

スクリーンの一番下にデバッグツールバーが表示されている。これで正しい情報を見ることができる。

小さな感嘆符(!)をクリックすると、Symfony profiler 内のログから “実際の” 例外のメッセージを見ることができます。スタックトレースを見たいときは、左のメニューの “Exception” リンクをクリックしてください。

トラブルシューティング (Symfony 5.4 Docs)

コードに問題があるときは、問題が起きている箇所を調べることができる「Exceptions」ページが表示される。

【Tips】
トラブルシューティングの際は、「symfony server:log;」コマンドを使うこと。デバッグ時にログはとても役に立つ。このコマンドは、WebサーバーやPHPやアプリケーションのログをtailしてくれる。

本番のデバッグ

本番サーバーのデバッグは、より複雑で「Symfony profiler」は使えないし、ログの情報も冗長にはしていないそう。でも、ログのtailは可能とのこと。

symfony cloud:logs --tail

また、Webコンテナ上にSSHで接続することも可能だそうだ。

symfony cloud:ssh

コントローラーの生成

make:controller コマンドで最初の コントローラー を作成しましょう:

$ symfony console make:controller ConferenceController

このコマンドは src/Controller ディレクトリ以下に ConferenceController クラスを作成します。生成されたクラスはちゃんと動くようなボイラープレートが既に入っています:

コントローラーを作成する (Symfony 5.4 Docs)

========【以下、引用】========

src/Controller/ConferenceController.php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class ConferenceController extends AbstractController
{
    #[Route('/conference', name: 'conference')]
    public function index(): Response
    {
        return $this->render('conference/index.html.twig', [
            'controller_name' => 'ConferenceController',
        ]);
    }
}

#[Route('/conference', name: 'conference')] アトリビュートが、 ConferenceController の index() メソッドをコントローラにしています(設定は、コードに隣接しています)。

/conference をブラウザで開くと、このコントローラが実行され、レスポンスが返されます。

ホームページにマッチするようにルートを微調整します:

--- a/src/Controller/ConferenceController.php
+++ b/src/Controller/ConferenceController.php
@@ -8,7 +8,7 @@ use Symfony\Component\Routing\Annotation\Route;

 class ConferenceController extends AbstractController
 {
-    #[Route('/conference', name: 'conference')]
+    #[Route('/', name: 'homepage')]
     public function index(): Response
     {
         return $this->render('conference/index.html.twig', [

コード内でホームページを参照したいときは、ルートの 名前 が便利です。 / パスをハードコードせずに、 ルート名を使いましょう。

デフォルトで表示されるページの代わりに、シンプルな HTML のページを返すようにしましょう:

--- a/src/Controller/ConferenceController.php
+++ b/src/Controller/ConferenceController.php
@@ -11,8 +11,13 @@ class ConferenceController extends AbstractController
     #[Route('/', name: 'homepage')]
     public function index(): Response
     {
-        return $this->render('conference/index.html.twig', [
-            'controller_name' => 'ConferenceController',
-        ]);
+        return new Response(<<<EOF
+<html>
+    <body>
+        <img src="/images/under-construction.gif" />
+    </body>
+</html>
+EOF
+        );
     }
 }

ブラウザを更新します:

========【引用ここまで(引用元:コントローラーを作成する (Symfony 5.4 Docs))】========

更新したら、以下の画面が表示されました!ここまでOKです!

Controller

Conttollerの主な役割は、リクエストに対応するHTTPレスポンスを返すこと。

この記事を書いた人