在 Symfony 中创建您的第一个页面
创建一个新页面——无论是 HTML 页面还是 JSON 端点——都包含两个步骤
- 创建控制器:控制器是您编写的 PHP 函数,用于构建页面。您获取传入的请求信息,并使用它来创建一个 Symfony
Response
对象,该对象可以包含 HTML 内容、JSON 字符串,甚至二进制文件(如图像或 PDF); - 创建路由:路由是您页面的 URL(例如
/about
),并指向一个控制器。
视频教程
您喜欢视频教程吗?查看 Harmonious Development with Symfony 视频教程系列。
另请参阅
Symfony 拥抱 HTTP 请求-响应生命周期。要了解更多信息,请参阅 Symfony 和 HTTP 基础知识。
创建页面:路由和控制器
提示
在继续之前,请确保您已阅读 Setup 文章,并且可以在浏览器中访问您的新 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 server,请通过访问:http://127.0.0.1:8000/lucky/number 尝试一下
提示
Symfony 建议将路由定义为属性,以便将控制器代码及其路由配置放在同一位置。但是,如果您愿意,您可以使用 YAML、XML 和 PHP 格式在单独的文件中定义路由。
如果您看到一个幸运数字打印回给您,恭喜!但在您冲去买彩票之前,请了解一下这是如何工作的。还记得创建页面的两个步骤吗?
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
时自动补全命令和其他输入。有关如何设置补全的更多信息,请参阅 Console 文档。
Web 调试工具栏:调试利器
Symfony 最棒的功能之一是 Web 调试工具栏:一个在您开发时在页面底部显示大量调试信息的栏。这都通过一个名为 symfony/profiler-pack
的 Symfony 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 中打印变量。刷新您的浏览器以获取您的新幸运数字!
现在您可能想知道 Web 调试工具栏去哪里了:那是因为当前模板中没有 <body>
标签。您可以自己添加 body 元素,或者扩展 base.html.twig
,其中包含所有默认 HTML 元素。
在 templates 文章中,您将了解有关 Twig 的所有信息:如何循环、渲染其他模板以及利用其强大的布局继承系统。
项目结构概览
好消息!您已经了解了项目中最重要的一些目录
config/
- 包含... 配置!您将配置路由、服务和软件包。
src/
- 您所有的 PHP 代码都放在这里。
templates/
- 您所有的 Twig 模板都放在这里。
大多数时候,您将在 src/
、templates/
或 config/
中工作。随着您的继续阅读,您将了解在这些目录中可以完成什么。
那么项目中的其他目录呢?
bin/
- 著名的
bin/console
文件位于此处(以及其他不太重要的可执行文件)。 var/
- 这是存储自动创建的文件的地方,例如缓存文件 (
var/cache/
) 和日志 (var/log/
)。 vendor/
- 第三方(即 “vendor”)库位于此处!这些是通过 Composer 包管理器下载的。
public/
- 这是您项目的文档根目录:您将任何可公开访问的文件放在这里。
当您安装新的软件包时,将在需要时自动创建新目录。