Flex:编写您的应用程序
阅读本教程的第一部分后,你决定再花 10 分钟研究一下 Symfony。好选择!在本教程的第二部分,你将了解 Symfony Flex:这个神奇的工具可以让添加新功能变得像运行一个命令一样简单。这也是为什么 Symfony 非常适合小型微服务或大型应用程序的原因。好奇吗?太完美了!
启动微服务
除非您正在构建纯 API(关于这一点很快就会详细介绍),否则您可能希望渲染 HTML。为此,您将使用 Twig。Twig 是一个灵活、快速且安全的 PHP 模板引擎。它使您的模板更易于阅读和简洁;它还使它们对网页设计师更加友好。
是否在我们的应用程序中已经安装了 Twig?实际上,还没有!这真是太好了!当你开始一个新的 Symfony 项目时,它很小:只有最关键的依赖项包含在你的 composer.json 文件中:
"require": {
"...",
"symfony/console": "^6.1",
"symfony/flex": "^2.0",
"symfony/framework-bundle": "^6.1",
"symfony/yaml": "^6.1"
}
这使得 Symfony 与其他任何 PHP 框架都不同!它不是从一个包含所有可能需要的功能的庞大应用程序开始,而是从一个小巧、简单且快速的应用程序开始。而且你可以完全控制你添加的内容。
Flex 菜谱和别名
所以,我们如何安装和配置 Twig?通过运行一条单独的命令:
composer require twig
两个非常有趣的事情在幕后发生,多亏了 Symfony Flex:一个已经安装在我们项目中的 Composer 插件。
首先, twig 不是一个作曲家包的名称:它是一个 Flex 别名,指向 symfony/twig-bundle 。Flex 为 Composer 解析该别名。
其次,Flex 安装了一个名为 symfony/twig-bundle 的配方。什么是配方?它是一种让库通过添加和修改文件来自动配置自己的方式。多亏了配方,添加功能变得无缝且自动化:安装一个包,你就完成了!
您可以在食谱仓库中的 RECIPES.md 文件内找到完整的食谱和别名列表。
这个食谱做了什么?除了在 config/bundles.php 中自动启用功能外,它还增加了 3 件事:
- config/packages/twig.yaml 一个设置 Twig 的合理默认值的配置文件。
- config/packages/test/twig.yaml 一个在运行测试时更改一些 Twig 选项的配置文件。
- templates/ 这是模板文件将存放的目录。食谱还添加了一个 base.html.twig 布局文件。
Twig:渲染模板
感谢 Flex,只需一条命令,您就可以立即开始使用 Twig:
<?php
// src/Controller/DefaultController.php
namespace App\Controller;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\HttpFoundation\Response;
+ use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
- class DefaultController
+ class DefaultController extends AbstractController
{
#[Route('/hello/{name}', methods: ['GET'])]
public function index(string $name): Response
{
- return new Response("Hello $name!");
+ return $this->render('default/index.html.twig', [
+ 'name' => $name,
+ ]);
}
}
通过扩展 AbstractController ,你现在可以访问许多快捷方法和工具,如 render() 。创建新模板:
{# templates/default/index.html.twig #}
<h1>Hello {{ name }}</h1>
这就是了! {{ name }} 语法将打印从控制器传递进来的 name 变量。如果你是 Twig 的新手,欢迎!你以后会了解更多关于其语法和功能的内容。
但是,目前该页面只包含 h1 标签。为了给它一个 HTML 布局,扩展 base.html.twig :
{# templates/default/index.html.twig #}
{% extends 'base.html.twig' %}
{% block body %}
<h1>Hello {{ name }}</h1>
{% endblock %}
这是称为模板继承:我们的页面现在从 base.html.twig 继承 HTML 结构。
Profiler:调试利器
Symfony最酷的功能之一甚至还没有安装!让我们解决这个问题:
composer require profiler
是的!这是另一个别名! Flex还安装了另一个配方,它可以自动配置 Symfony 的 Profiler。结果如何?刷新!
看到底部的黑条了吗?这就是网络调试工具栏,它是您最好的新朋友。通过将鼠标悬停在每个图标上,您可以获得有关执行的控制器、性能信息、缓存命中和未命中等信息。单击任何图标即可进入分析器,您可以在其中获得更详细的调试和性能数据!
哦,当您安装更多库时,您将获得更多工具(例如显示数据库查询的 Web 调试工具栏图标)。
您现在可以直接使用探查器,因为它通过配方自行配置。我们还可以安装什么?
丰富的API支持
您正在构建 API 吗?您已经可以从任何控制器返回 JSON:
// src/Controller/DefaultController.php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Attribute\Route;
class DefaultController extends AbstractController
{
// ...
#[Route('/api/hello/{name}', methods: ['GET'])]
public function apiHello(string $name): JsonResponse
{
return $this->json([
'name' => $name,
'symfony' => 'rocks',
]);
}
}
但对于真正丰富的 API,请尝试安装API Platform:
composer require api
这是api-platform/api-pack Symfony pack的别名,它依赖于其他几个包,例如 Symfony 的验证器和安全组件,以及 Doctrine ORM。事实上,Flex 安装了5 个食谱!
但像往常一样,我们可以立即开始使用新库。想要为product表创建丰富的 API?创建一个Product实体并为其赋予#[ApiResource]属性:
// src/Entity/Product.php
namespace App\Entity;
use ApiPlatform\Core\Annotation\ApiResource;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity]
#[ApiResource]
class Product
{
#[ORM\Id]
#[ORM\GeneratedValue(strategy: 'AUTO')]
#[ORM\Column(type: 'integer')]
private int $id;
#[ORM\Column(type: 'string')]
private string $name;
#[ORM\Column(type: 'integer')]
private int $price;
// ...
}
完毕!您现在可以通过端点来列出、添加、更新和删除产品!不相信我?通过运行以下命令列出您的路线:
php bin/console debug:router
------------------------------ -------- -------------------------------------
Name Method Path
------------------------------ -------- -------------------------------------
api_products_get_collection GET /api/products.{_format}
api_products_post_collection POST /api/products.{_format}
api_products_get_item GET /api/products/{id}.{_format}
api_products_put_item PUT /api/products/{id}.{_format}
api_products_delete_item DELETE /api/products/{id}.{_format}
...
------------------------------ -------- -------------------------------------
删除食谱
还不相信吗?没问题:删除库:
composer remove api
Flex 将卸载配方:删除文件并撤消更改以使您的应用程序恢复到原始状态。无忧无虑地进行实验。
更多功能、架构和速度
我希望您和我一样对 Flex 感到兴奋!但我们还有一章,而且是最重要的一章。我想向您展示 Symfony 如何帮助您在不牺牲代码质量或性能的情况下快速构建功能。这一切都与服务容器有关,这也是 Symfony 的超能力。