# Symfony 简介

> 原文： [http://zetcode.com/symfony/intro/](http://zetcode.com/symfony/intro/)

这是 Symfony 的入门教程。 它展示了 Symfony PHP 框架，并展示了如何创建简单的示例。 本教程介绍了 Symfony 版本 4。

## Symfony

Symfony 是一组可重用的 PHP 组件和一个用于 Web 项目的 PHP 框架。 Symfony 于 2005 年发布为免费软件。Symfony 的原始作者是 Fabien Potencier。 Symfony 受到 Spring 框架的极大启发。

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

Symfony 创建了自己的组件，包括 Symfony 依赖注入器和 Symfony YAML 解析器。

## 设置 Symfony 项目

为了创建一个 Symfony 4 项目，我们需要 PHP 7（以及相关的库，例如 php-xml 或 php-mcrypt）和`composer`。 项目相关性将写入`composer.json`文件。

```php
$ composer create-project symfony/skeleton symfirst

```

使用`composer`，我们创建了一个名为`first`的新 Symfony 骨架项目。 Symfony 框架等效于微型框架，在微型框架中，我们需要自己安装所有模块。 我们决定要安装什么模块。 这对学习有好处。

```php
$ cd symfirst

```

不要忘记去项目目录。

## Symfony 项目结构

作曲家创建了一个 Symfony 应用结构。

```php
$ ls -p
bin/           composer.lock  public/  symfony.lock  vendor/
composer.json  config/        src/     var/

```

`bin`目录包含`console`工具，该工具是用于执行各种类型命令的命令行工具。 `public`目录包含 Web 文件。 在 Symfony 骨架应用中，它包含一个文件：`index.php`，它是一个 Symfony 前端控制器。

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

在`composer.json`中定义了 Composer 依赖项。 `composer.lock`记录已安装的确切版本，以便以后可以重新安装。 它可以确保每个在项目上工作的人都具有相同的确切版本的库。 `symfony.lock`文件是 Symfony 配方的正确锁定文件。

还有两个特定的隐藏文件：`.env`和`.env.dist`。 `.env`的内容成为环境变量。 环境变量由各种工具（例如 ORM 库）使用。 `.env`可能包含敏感或计算机特定的数据； 因此，不应将其提交到存储库。 相反，`.env.dist`带有一些伪值。

## 安装 Symfony 项目依赖项

接下来，我们将安装一些项目依赖项。

```php
$ composer require server maker --dev

```

我们安装了开发服务器和 maker 组件，该组件用于生成命令，控制器，表单类或事件订阅者。

```php
$ composer require annotations twig

```

我们将安装两个附加的 Symfony 模块。 `annotations`提供了一种使用注释配置控制器的方法。 `twig`允许在 Symfony 应用中使用 Twig 模板引擎。

## Symfony 创建控制器

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

```php
$ php bin/console make:controller HelloController

```

使用`console`工具，创建`HelloController`。 在`src/Controller/`目录中创建控制器。

`src/Controller/HelloController.php`

```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`文件中。

```php
/**
 * @Route("/plain", name="plain")
 */
public function helloPlain()
{

```

路由是从 URL 路径到控制器方法的映射。 `@Route`注释将`/plain` URL 路径映射到`helloPlain()`函数。

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

```

该函数返回一个`Response`对象。 `Response`对象保存需要从给定请求发送回客户端的所有信息。 构造函数最多包含三个参数：响应内容，状态代码和 HTTP 标头数组。 默认状态码为`Response::HTTP_OK`，内容类型为`text/html`。

```php
$ php bin/console server:run

```

使用`bin/console server:run`命令启动 Web 服务器。 要停止服务器，我们使用`bin/console server:stop`命令。

```php
$ curl localhost:8000/plain
Hello there

```

我们向普通路由发出 GET 请求，并查看文本响应。

## Symfony 与 Twig 模板

当我们使用`composer require twig`命令时，将 Twig 模板引擎安装到项目目录中。 还创建了一个`templates`目录。 在该目录中，我们放置模板文件。 模板文件具有`html.twig`扩展名。

`src/Controller/HelloController.php`

```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 模板。

```php
/**
 * @Route("/twig", name="twig")
 */
public function helloTwig(): Response
{

```

`helloTwig()`功能映射到`twig`路径。

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

```

Twig 渲染位于`templates`目录中的`'hello/index.html.twig`文件。 `render()`方法也接受数据； 在我们的例子中，它是一个消息变量。 模板引擎将数据与 HTML 结构合并。

`templates/hello/index.html.twig`

```php
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Hello</title>
  </head>
  <body>
    {{ message }}
  </body>
</html>

```

这是 Twig 模板文件。

```php
{{ message }}

```

`{{ }}`是一种特殊的 Twig 语法，它显示变量的内容。

```php
$ curl localhost:8000/twig
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Hello</title>
  </head>
  <body>
    Hello from Twig
  </body>
</html>

```

当我们连接到树枝路径时，我们将获得此 HTML 输出。

在本教程中，我们介绍了 Symfony 框架。

您可能也对以下相关教程感兴趣： [Symfony 表单教程](/symfony/form/)， [Symfony 请求教程](/symfony/request/)， [Twig 教程](/php/twig/)， [PHP 教程](/lang/php/)。

列出[所有 Symfony 教程](/all/#symfony)。