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/
目录中。
<?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
扩展名。
<?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
变量。
{% extends 'base.html.twig' %} {% block title %}Plain message{% endblock %} {% block body %} {{ message }} {% endblock %}
这是 Twig 模板文件。
{% extends 'base.html.twig' %}
该模板继承自 base.html.twig
文件,该文件包含跨模板共享的基本标记。
{{ message }}
{{ }}
语法输出 message
变量的内容。
<!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 教程。