跳到内容

在 Symfony 中创建您的第一个页面

编辑此页

创建一个新页面——无论是 HTML 页面还是 JSON 端点——都包含两个步骤

  1. 创建控制器:控制器是您编写的 PHP 函数,用于构建页面。您获取传入的请求信息,并使用它来创建一个 Symfony Response 对象,该对象可以包含 HTML 内容、JSON 字符串,甚至二进制文件(如图像或 PDF);
  2. 创建路由:路由是您页面的 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 格式在单独的文件中定义路由

如果您看到一个幸运数字打印回给您,恭喜!但在您冲去买彩票之前,请了解一下这是如何工作的。还记得创建页面的两个步骤吗?

  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 时自动补全命令和其他输入。有关如何设置补全的更多信息,请参阅 Console 文档

Web 调试工具栏:调试利器

Symfony 最棒的功能之一是 Web 调试工具栏:一个在您开发时在页面底部显示大量调试信息的栏。这都通过一个名为 symfony/profiler-packSymfony 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 中打印变量。刷新您的浏览器以获取您的新幸运数字!

http://127.0.0.1:8000/lucky/number

现在您可能想知道 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/
这是您项目的文档根目录:您将任何可公开访问的文件放在这里。

当您安装新的软件包时,将在需要时自动创建新目录。

下一步?

恭喜!您已经开始掌握 Symfony,并学习一种构建美观、实用、快速且可维护应用程序的全新方法。

好了,是时候通过阅读以下文章来完成对基础知识的掌握了

然后,了解其他重要主题,例如 服务容器表单系统、使用 Doctrine(如果您需要查询数据库)等等!

玩得开心!

本作品,包括代码示例,均根据 Creative Commons BY-SA 3.0 许可协议获得许可。
目录
    版本