ZetCode

Symfony 7.2 入门

最后修改时间:2025年3月3日

这是一个 Symfony 入门教程。它介绍了 Symfony PHP 框架,并展示了如何使用 Symfony 7.2 创建简单的示例。

Symfony

Symfony 是一套可重用的 PHP 组件,也是一个用于 Web 项目的 PHP 框架。Symfony 于 2005 年发布为自由软件。Symfony 的最初作者是 Fabien Potencier。Symfony 深受 Spring Framework 的启发。

Symfony 使用多个 PHP 开源项目,例如 Doctrine 对象-关系映射库、PDO 数据库抽象层、PHPUnit 测试框架、Twig 模板引擎和 Symfony Mailer 电子邮件库。

Symfony 创建了自己的组件,包括 Symfony Dependency Injector 和 Symfony YAML 解析器。

Symfony CLI

Symfony CLI 是一个用于在本地和 Symfony Cloud 上创建和管理 Symfony 应用程序的工具。它包含一个强大的本地 Web 服务器用于开发应用程序。您可以从 官方 Symfony 网站 下载 Symfony CLI。

设置 Symfony 项目

要创建 Symfony 7.2 项目,您需要 PHP 8.2 或更高版本(以及相关的库,如 php-xml 或 php-mbstring)和 composer。项目依赖项写入 composer.json 文件。

$ symfony new symfirst

使用 symfony CLI,我们创建一个新的 Symfony 骨架项目。骨架项目是一个最小的项目结构,您可以在其中仅安装所需的组件。

$ cd symfirst

导航到项目目录。

Symfony 项目结构

Symfony CLI 创建以下目录结构

$ ls -1ap --group-directories-first
./
../
bin/
config/
public/
src/
templates/
var/
vendor/
.env
.gitignore
composer.json
composer.lock
symfony.lock

bin 目录包含 console 工具,这是一个用于执行各种类型命令的命令行实用程序。public 目录包含 Web 文件,包括 index.php 前端控制器。

第三方依赖项存储在 vendor 目录中。config 目录包含配置文件。源代码写在 src 目录中。var 目录包含临时文件,例如缓存数据。

.env 文件包含环境变量,.gitignore 文件指定要被 Git 忽略的有意不跟踪的文件。

安装 Symfony 项目依赖项

接下来,我们安装几个项目依赖项。

$ composer require symfony/maker-bundle --dev

我们安装 Maker bundle,它用于生成命令、控制器、表单类或事件订阅者。

$ composer req twig

我们安装 twig 以使用 Twig 模板引擎。

Symfony 创建控制器

Symfony 控制器是一个 PHP 函数,它读取 Request 对象的信息,并创建和返回一个 Response 对象。响应可以是 HTML 页面、JSON、XML、文件下载、重定向、404 错误等。

$ php bin/console make:controller HelloController

使用 console 工具,我们创建一个 HelloController。该控制器创建在 src/Controller/ 目录中。

src/Controller/HelloController.php
<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class HelloController extends AbstractController
{
    #[Route('/plain', name: 'plain')]
    public function helloPlain(): Response
    {
        return new Response("Hello there", Response::HTTP_OK,
            ['content-type' => 'text/plain']);
    }
}

这是 HelloController。它位于 src/Controller/HelloController.php 文件中。

#[Route('/plain', name: 'plain')]
public function helloPlain(): Response

#[Route] 属性将 /plain URL 路径映射到 helloPlain 函数。

return new Response("Hello there", Response::HTTP_OK,
  ['content-type' => 'text/plain']);

该函数返回一个 Response 对象。构造函数接受响应内容、状态码和 HTTP 标头数组。

$ symfony serve

使用 symfony serve 启动本地 Web 开发服务器。

$ curl 127.0.0.1:8000/plain
Hello there

发出对 /plain 路由的 GET 请求以查看文本响应。

Symfony 与 Twig 模板

当我们安装 Twig bundle 时,创建了一个 templates 目录。这是我们放置模板文件的地方,它们具有 html.twig 扩展名。

src/Controller/HelloController.php
<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class HelloController extends AbstractController
{
    #[Route('/plain', name: 'plain')]
    public function helloPlain(): Response
    {
        return new Response("Hello there", Response::HTTP_OK,
            ['content-type' => 'text/plain']);
    }

    #[Route('/twig', name: 'twig')]
    public function helloTwig(): Response
    {
        $message = "Hello from Twig";
        return $this->render('hello/index.html.twig', ["message" => $message]);
    }
}

我们已更新 HelloController.php 文件以包含一个新路由。此路由渲染一个 Twig 模板。

#[Route('/twig', name: 'twig')]
public function helloTwig(): Response

helloTwig 函数映射到 /twig 路径。

$message = "Hello from Twig";
return $this->render('hello/index.html.twig', ["message" => $message]);

Twig 渲染 templates 目录中位于 hello/index.html.twig 的文件。render 方法还接受数据,例如 message 变量。

templates/hello/index.html.twig
{% extends 'base.html.twig' %}

{% block title %}Plain message{% endblock %}

{% block body %}
    {{ message }}
{% endblock %}

这是 Twig 模板文件。

{% extends 'base.html.twig' %}

该模板继承自 base.html.twig 文件,该文件包含跨模板共享的基本标记。

{{ message }}

{{ }} 语法输出 message 变量的内容。

templates/base.html.twig
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>{% block title %}Welcome!{% endblock %}</title>
        {% block stylesheets %}{% endblock %}
    </head>
    <body>
        {% block body %}{% endblock %}
    </body>
</html>

base.html.twig 模板包含共享代码,并定义了可以在子模板中替换的块。

$ curl 127.0.0.1:8000/twig
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Plain message</title>
      </head>
    <body>
          Hello from Twig
    </body>
</html>

这是连接到 /twig 路径时的 HTML 输出。

在本教程中,我们介绍了 Symfony 7.2 框架并创建了简单的示例。

列出 所有 Symfony 教程