2

创建你的第一个Symfony页面

创建一个新页面 - 无论是HTML页面还是JSON端点 - 分为两步:

  1. 创建一个路由: 路由(route)是一个指向你的页面URL(比如/about), 同时它映射到一个控制器.
  2. 创建一个控制器: 控制器(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

如果你看到幸运号码被输出到浏览器, 那么恭喜! 但是在你开始玩彩票之前, 先要了解它是如何运行的. 还记得创建页面的两个步骤吗?

  1. 创建一个路由: 在 config/routes.yaml 文件中, 路由定义了URL到页面的映射和要调用的控制器. 在本章节中你将会了解有关路由的更多信息, 包括如何创建变量URL.
  2. 创建一个控制器: 这是一个构建并最终返回一个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/

这是项目的文档根目录: 你可以在此目录放置任何可公开访问的文件.

当你安装新软件包时, 将在需要时自动创建新目录.


dreamans
725 声望847 粉丝

专注PHP、Go、微服务、数据库、分布式系统、算法等后端技术。