跳到內容

在 Symfony 中建立您的第一個頁面

編輯此頁面

建立新頁面 - 無論是 HTML 頁面還是 JSON 端點 - 都是一個兩步驟的過程

  1. 建立控制器:控制器是您編寫的 PHP 函數,用於建構頁面。您取得傳入的請求資訊,並使用它來建立 Symfony Response 物件,其中可以包含 HTML 內容、JSON 字串,甚至二進制檔案,例如圖像或 PDF;
  2. 建立路由:路由是您頁面的 URL (例如 /about),並指向控制器。

螢幕錄影

您偏好影片教學嗎?請查看 與 Symfony 和諧開發 螢幕錄影系列。

另請參閱

Symfony 擁抱 HTTP 請求-回應生命週期。若要了解更多資訊,請參閱 Symfony 與 HTTP 基礎知識

建立頁面:路由與控制器

提示

在繼續之前,請確定您已閱讀 設定 文章,並且可以在瀏覽器中存取您的新 Symfony 應用程式。

假設您想要建立一個頁面 - /lucky/number - 產生一個幸運數字 (嗯,隨機數字) 並列印出來。若要執行此操作,請建立一個「Controller」類別和其中的「controller」方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
// src/Controller/LuckyController.php
namespace App\Controller;

use Symfony\Component\HttpFoundation\Response;

class LuckyController
{
    public function number(): Response
    {
        $number = random_int(0, 100);

        return new Response(
            '<html><body>Lucky number: '.$number.'</body></html>'
        );
    }
}

現在您需要將此控制器函數與公用 URL (例如 /lucky/number) 建立關聯,以便在使用者瀏覽到該 URL 時呼叫 number() 方法。此關聯是使用 #[Route] 屬性定義的 (在 PHP 中,屬性 用於將元數據新增至程式碼)

1
2
3
4
5
6
7
8
9
10
11
12
13
// src/Controller/LuckyController.php

  // ...
+ use Symfony\Component\Routing\Attribute\Route;

  class LuckyController
  {
+     #[Route('/lucky/number')]
      public function number(): Response
      {
          // this looks exactly the same
      }
  }

就是這樣!如果您使用 Symfony Web 伺服器,請嘗試前往:https://127.0.0.1:8000/lucky/number

提示

Symfony 建議將路由定義為屬性,以便將控制器程式碼及其路由組態放在相同位置。但是,如果您偏好,可以使用 YAML、XML 和 PHP 格式在個別檔案中定義路由

如果您看到幸運數字列印回覆給您,恭喜您!但在您衝去玩樂透之前,請查看其運作方式。還記得建立頁面的兩個步驟嗎?

  1. 建立控制器和方法:這是一個由建構頁面並最終傳回 Response 物件的函數。您將在其自己的章節中了解更多關於 控制器 的資訊,包括如何傳回 JSON 回應;
  2. 建立路由:在 config/routes.yaml 中,路由定義您頁面的 URL (path) 以及要呼叫的 controller。您將在其自己的章節中了解更多關於 路由 的資訊,包括如何建立變數 URL。

bin/console 命令

您的專案已經有一個強大的除錯工具:bin/console 命令。嘗試執行它

1
$ php bin/console

您應該會看到命令清單,這些命令可以提供除錯資訊、協助產生程式碼、產生資料庫遷移等等。當您安裝更多套件時,您會看到更多命令。

若要取得系統中所有路由的清單,請使用 debug:router 命令

1
$ php bin/console debug:router

您應該會在清單中看到您的 app_lucky_number 路由

1
2
3
4
5
----------------  -------  -------  -----  --------------
Name              Method   Scheme   Host   Path
----------------  -------  -------  -----  --------------
app_lucky_number  ANY      ANY      ANY    /lucky/number
----------------  -------  -------  -----  --------------

除了 app_lucky_number 之外,您也會看到除錯路由 - 在下一節中會說明更多關於除錯路由的資訊。

當您繼續時,您將學習更多命令!

提示

如果您的 shell 受到支援,您也可以設定主控台完成支援。這會在您使用 bin/console 時自動完成命令和其他輸入。如需有關如何設定完成的更多資訊,請參閱 主控台文件

Web 除錯工具列:除錯夢想

Symfony 的 驚人 功能之一是 Web 除錯工具列:一個工具列,在您開發時,會在頁面底部顯示大量除錯資訊。這一切都包含在開箱即用的 Symfony 套件 中,稱為 symfony/profiler-pack

您會在頁面底部看到一個深色工具列。您將在過程中了解更多關於它所包含的所有資訊,但請隨意實驗:將滑鼠游標停留在不同的圖示上方並按一下,以取得關於路由、效能、記錄等的資訊。

渲染模板

如果您從控制器傳回 HTML,您可能會想要渲染模板。幸運的是,Symfony 隨附 Twig:一種模板語言,它簡潔、強大且實際上非常有趣。

使用以下命令安裝 twig 套件

1
$ composer require twig

確保 LuckyController 擴展了 Symfony 的基本 AbstractController 類別

1
2
3
4
5
6
7
8
9
10
// src/Controller/LuckyController.php

  // ...
+ use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

- class LuckyController
+ class LuckyController extends AbstractController
  {
      // ...
  }

現在,使用方便的 render() 方法來渲染模板。將 number 變數傳遞給它,以便您可以在 Twig 中使用它

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// src/Controller/LuckyController.php
namespace App\Controller;

use Symfony\Component\HttpFoundation\Response;
// ...

class LuckyController extends AbstractController
{
    #[Route('/lucky/number')]
    public function number(): Response
    {
        $number = random_int(0, 100);

        return $this->render('lucky/number.html.twig', [
            'number' => $number,
        ]);
    }
}

模板檔案位於 templates/ 目錄中,該目錄在您安裝 Twig 時自動為您建立。建立一個新的 templates/lucky 目錄,其中包含一個新的 number.html.twig 檔案

1
2
{# templates/lucky/number.html.twig #}
<h1>Your lucky number is {{ number }}</h1>

{{ number }} 語法用於在 Twig 中列印變數。重新整理您的瀏覽器以取得您的幸運數字!

https://127.0.0.1:8000/lucky/number

現在您可能會想知道 Web 除錯工具列跑到哪裡去了:那是因為目前的模板中沒有 </body> 標籤。您可以自行新增 body 元素,或擴展 base.html.twig,其中包含所有預設 HTML 元素。

模板 文章中,您將了解關於 Twig 的所有資訊:如何迴圈、渲染其他模板以及利用其強大的版面配置繼承系統。

查看專案結構

好消息!您已經在專案中最重要的目錄中工作過

config/
包含... 組態!。您將組態路由、服務 和套件。
src/
您的所有 PHP 程式碼都位於此處。
templates/
您的所有 Twig 模板都位於此處。

大多數時候,您將在 src/templates/config/ 中工作。當您繼續閱讀時,您將了解在這些目錄中可以完成哪些工作。

那麼專案中的其他目錄呢?

bin/
著名的 bin/console 檔案位於此處 (以及其他較不重要的可執行檔)。
var/
這是儲存自動建立檔案的位置,例如快取檔案 (var/cache/) 和記錄檔 (var/log/)。
vendor/
協力廠商 (即「vendor」) 程式庫位於此處!這些是透過 Composer 套件管理器下載的。
public/
這是您專案的文件根目錄:您將任何可公開存取的檔案放在這裡。

當您安裝新套件時,將在需要時自動建立新目錄。

下一步?

恭喜!您已經開始掌握 Symfony,並學習一種全新的方式來建構美觀、實用、快速且可維護的應用程式。

好的,現在是時候完成掌握基礎知識,閱讀以下文章

然後,學習其他重要主題,例如 服務容器表單系統、使用 Doctrine (如果您需要查詢資料庫) 等等!

玩得開心!

本作品,包括程式碼範例,根據 Creative Commons BY-SA 3.0 授權條款授權。
目錄
    版本