{% raw %}

# Symfony 表单教程

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

Symfony 表单教程展示了如何在 Symfony 中创建和处理表单。 在本教程中，我们不使用 Symfony 表单构建器。

## Symfony

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

## HTML 表单

HTML 表单用于用户与网站或应用之间的交互。 它们允许用户将数据发送到网站。 HTML 表单由一个或多个小部件组成。 这些小部件可以是文本字段，选择框，按钮，复选框或单选按钮。 这些小部件通常与描述其用途的标签配对。

## Symfony 表单示例

在下面的示例中，我们创建一个 HTML 表单。 表单中的数据由 Symfony 控制器处理。

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

```

使用`composer`，我们创建一个新的 Symfony 骨架项目。

```php
$ cd myform

```

我们转到项目目录。

```php
$ composer req annotations twig

```

我们安装了两个模块：`annotations`和`twig`。

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

```

我们安装开发 Web 服务器和制造商。

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

```

我们创建一个`HomeController`。

`src/Controller/HomeController.php`

```php
<?php

namespace App\Controller;

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

class HomeController extends AbstractController
{
    /**
     * @Route("/", name="home")
     */
    public function index()
    {
        return $this->render('home/index.html.twig');
    }
}

```

`HomeController`返回包含 HTML 表单的主页。

`templates/home/index.html.twig`

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

{% block title %}Home page{% endblock %}

{% block body %}

<section class="ui container">

    <form class="ui form" action="message" method="get">

        <div class="field">
            <label>Name:</label>
            <input type="text" name="name">
        </div>

        <div class="field">
            <label>Message</label>
            <input type="text" name="message">
        </div>

        <button class="ui button" type="submit">Send</button>

    </form>

</section>

{% endblock %}

```

`HomeController`返回包含 HTML 表单的主页。 该表格包含两个输入字段。 这些字段的内容将通过两个请求属性传递到请求对象中。

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

```

该模板继承自`base.html.twig`文件，该文件具有要共享的基本标记。 例如，我们包括语义 UI CSS 框架的文件。

`templates/base.html.twig`

```php
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>{% block title %}Welcome!{% endblock %}</title>
        <link href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.css"
            rel="stylesheet">
    </head>

    <body>
        {% block body %}{% endblock %}
    </body>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.js"></script>
</html>

```

`base.html.twig`模板包含其他模板文件共享的代码。 它定义了将在子模板中替换的块。

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

```

创建了`MessageController`。

`src/Controller/MessageController.php`

```php
<?php

namespace App\Controller;

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

class MessageController extends AbstractController
{
    /**
     * @Route("/message", name="message", methods="GET")
     */
    public function index(Request $request)
    {
        $name = $request->query->get("name");
        $message = $request->query->get("message");

        return $this->render('message/index.html.twig', ["name" => $name,
            "message" => $message]);
    }
}

```

`MessageController`处理表格。

```php
/**
 * @Route("/message", name="message", methods="POST")
 */

```

`@Route`注解将`message`路径映射到`index()`方法。 `methods`参数定义请求类型。

```php
public function index(Request $request)

```

我们将`Request`对象注入该方法。

```php
$name = $request->query->get("name");
$message = $request->query->get("message");

```

从请求对象中，我们获得两个请求参数。

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

```

我们渲染`message/index.html.twig`模板。 我们将两个变量传递给模板。

`templates/message/index.html.twig`

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

{% block title %}Show message{% endblock %}

{% block body %}

{{name}} says: {{message}}

{% endblock %}

```

最后，我们有向用户显示消息的模板文件。 变量以`{{}}`语法显示。

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

```

我们运行该应用并导航到`localhost:8000`。

在本教程中，我们在 Symfony 应用中创建并处理了一个简单的 HTML 表单。

您可能也对以下相关教程感兴趣： [Symfony 保留表单值教程](/symfony/keepformvalues/)， [Symfony 简介](/symfony/intro/)， [Symfony 请求教程](/symfony/request/)， [Symfony 验证教程](/symfony/validation/) ， [Twig 教程](/php/twig/)， [Symfony DBAL 教程](/symfony/dbal/)或 [PHP 教程](/lang/php/)。

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

{% endraw %}