Skip to main content

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 的超能力。