創建你的第一個Symfony頁面
創建一個新頁面 - 無論是HTML頁面還是JSON端點 - 分為兩步:
- 創建一個路由: 路由(route)是一個指向你的頁面URL(比如/about), 同時它映射到一個控制器.
- 創建一個控制器: 控制器(controller)是你為了構造頁面而寫的功能. 獲取傳入的request請求信息並用它創建一個Symfony Response對象, 該對象可以包含HTML內容, JSON字符串甚至是圖像或PDF等二進制文件.
創建一個頁面: 路由和控制器
在開始之前, 請確保你已經閲讀安裝和配置Symfony章節, 並可以在瀏覽器中訪問你的Symfony應用程序.
假設你要新建一個 /lucky/number 頁面, 用於生成一個隨機的幸運數字並且輸出它. 為此,要先創建一個控制器類和控制器方法:
<?php
// src/Controller/LuckyController.php
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
class LuckyController
{
public function number()
{
$number = random_int(0, 100);
return new Response(
'<html><body>Lucky number: '.$number.'</body></html>'
);
}
}
現在, 你需要將此控制器功能與公共URL(例如: /lucky/number)相關聯, 以便在用户訪問此鏈接時執行 number() 方法. 通過在 config/routes.yaml 文件中創建路由來定義此關聯:
# config/routes.yaml
# the "app_lucky_number" route name is not important yet
app_lucky_number:
path: /lucky/number
controller: App\Controller\LuckyController::number
就這樣, 如果你正在使用Symfony Web服務, 可以嘗試訪問下:
http://localhost:8000/lucky/number
如果你看到幸運號碼被輸出到瀏覽器, 那麼恭喜! 但是在你開始玩彩票之前, 先要了解它是如何運行的. 還記得創建頁面的兩個步驟嗎?
- 創建一個路由: 在
config/routes.yaml文件中, 路由定義了URL到頁面的映射和要調用的控制器. 在本章節中你將會了解有關路由的更多信息, 包括如何創建變量URL. - 創建一個控制器: 這是一個構建並最終返回一個Response對象的功能, 在本章節中你將會了解有關控制器的更多信息, 包括如何返回JSON響應.
要更快的創建控制器, 可以讓 Symfony 來生成:
$ php bin/console make:controller
Annotation 路由
除了YAML, Symfony 允許使用annotation來定義路由. 為此, 請安裝annotation包:
$ composer require annotations
你可以直接在控制器上方添加路由:
<?php
// src/Controller/LuckyController.php
// ...
+ use Symfony\Component\Routing\Annotation\Route;
class LuckyController
{
+ /**
+ * @Route("/lucky/number")
+ */
public function number()
{
// this looks exactly the same
}
}
就這樣, 頁面 - http://localhost/lucky/number 將像以前一樣工作! Annotations 是配置路由的推薦方法.
使用 Symfony Flex 自動安裝『食譜』
你可能沒有注意到, 但當你運行 composer require annotations 時, 發生了兩件特別的事情, 這要歸功於一個名為Flex的強大的Componser插件.
首先, annotations 不是一個真正的包名: 它是Flex解析為 sensio/framework-extra-bundle 的別名.
其次, 此軟件包被下載之後, Flex執行一個『食譜』, 這是一組自動指令, 告訴Symfony如何繼承外部軟件包. Flex『食譜』適用於許多軟件包, 並且能夠做很多事情, 例如增加配置文件, 創建目錄, 更新.gitignore以及向.env文件添加新配置. Flex自動安裝軟件包, 以便於你能專注於編碼.
你可以通過閲讀 "Using Symfony Flex to Manage Symfony Applications"來了解有關Flex的更多信息. 但這不是必須的: 當你添加包時, Flex會在後台自動運行.
bin/console 命令
你的項目已經集成一個強大的調試工具: bin/console 命令. 嘗試運行一下:
$ php bin/console
你應該可以看到一組命令列表, 可以為你提供調試信息, 幫助生成代碼, 生成數據庫遷移等. 當你安裝更多軟件包時, 你將看到更多命令.
要獲取你的系統中所有路由列表, 可以使用 debug:router 命令:
php bin/console debug:router
你可以在最頂端看到你的 app_lucky_number 路由:
| Name | Method | Scheme | Host | Path |
|---|---|---|---|---|
| app_lucky_apinumber | ANY | ANY | ANY | /lucky/number |
你還將在 app_lucky_number 之後看到調試路由 - 更多信息將在下一節中介紹.
Web調試工具欄: Debugging Dream
Web Debug Toolbar 是Symfony的殺手級工具之一: 在開發過程中大量調試信息輸出在頁面底部,便於調試. 安裝 symfony/profiler-pack 即可開箱即用.
安裝好後, 頁面底部會出現一個黑色工具條. 你將瞭解更多有關它所包含的所有信息, 並可自由嘗試: 鼠標懸停或點擊工具條上不同圖標即可獲取有關路由, 性能, 日誌記錄等信息.
渲染模板
如果要從控制器返回HTML, 則可能需要渲染模板. 幸好, Symfony帶有Twig: 一個簡單,強大並且非常有趣的模板語言.
確保 LuckyController 繼承了Symfony的基礎 AbstractController 類:
// src/Controller/LuckyController.php
// ...
+ use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
- class LuckyController
+ class LuckyController extends AbstractController
{
// ...
}
現在, 使用簡便的 render() 函數來渲染模板. 傳遞一個數字變量, 以便於你可以在Twig中使用它:
// src/Controller/LuckyController.php
// ...
class LuckyController extends AbstractController
{
/**
* @Route("/lucky/number")
*/
public function number()
{
$number = random_int(0, 100);
return $this->render('lucky/number.html.twig', [
'number' => $number,
]);
}
}
模板文件存在於 templates/ 目錄中, 該目錄是在安裝Twig時自動創建的. 創建一個新目錄 templates/lucky , 在新目錄中創建模板文件 number.html.twig, 寫入內容:
{# templates/lucky/number.html.twig #}
<h1>Your lucky number is {{ number }}</h1>
{{number}} 語法在Twig中用來打印變量. 刷新瀏覽器以獲取新的幸運數字.
http://localhost:8000/lucky/number
現在你可能擔心Web Debug工具去了哪裏: 那是因為當前模板中沒有 </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/
這是項目的文檔根目錄: 你可以在此目錄放置任何可公開訪問的文件.
當你安裝新軟件包時, 將在需要時自動創建新目錄.