ZetCode

Symfony 表单

最后修改于 2020 年 7 月 5 日

Symfony 表单教程展示了如何在 Symfony 中创建和处理表单。在本教程中,我们不使用 Symfony 表单构建器。有关表单构建器的介绍,请参阅 Symfony 表单构建器教程

Symfony

Symfony 是一套可重用的 PHP 组件,也是一个用于 Web 项目的 PHP 框架。Symfony 于 2005 年发布为自由软件。Symfony 的最初作者是 Fabien Potencier。Symfony 深受 Spring Framework 的启发。

HTML 表单

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

注意: 对于不安全的 HTTP 请求方法,表单必须提供 CSRF(跨站请求伪造)保护。有关详细信息,请参阅 Symfony CSRF 教程

Symfony 表单示例

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

$ symfony new myform

使用 symfony CLI,我们创建一个新的 Symfony 骨架项目。

$ cd myform

我们进入项目目录。

$ composer req annot twig

我们安装了两个模块:annotationstwig

$ composer req maker --dev

我们将 maker 安装到开发依赖项中。

$ php bin/console make:controller HomeController

我们创建一个 HomeController

src/Controller/HomeController.php
<?php

namespace App\Controller;

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

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

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

templates/home/index.html.twig
{% 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 表单的主页。表单包含两个输入字段。这些字段的内容将通过两个请求属性传递到请求对象中。

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

该模板继承自 base.html.twig 文件,该文件包含将共享的基础标记。例如,我们包含 Semantic UI CSS 框架的文件。

templates/base.html.twig
<!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 bin/console make:controller MessageController

创建了一个 MessageController

src/Controller/MessageController.php
<?php

namespace App\Controller;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
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): Response
    {
        $name = $request->query->get("name");
        $message = $request->query->get("message");

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

MessageController 处理表单。

/**
 * @Route("/message", name="message", methods="GET")
 */

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

public function index(Request $request): Response

我们将 Request 对象注入到方法中。

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

从请求对象中,我们获取两个请求参数。

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

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

templates/message/index.html.twig
{% extends 'base.html.twig' %}

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

{% block body %}

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

{% endblock %}

最后,我们有了显示消息给用户的模板文件。变量使用 {{}} 语法显示。

$ symfony serve

我们运行应用程序并导航到 localhost:8000

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

列出 所有 Symfony 教程