Symfony 表单
最后修改于 2020 年 7 月 5 日
Symfony 表单教程展示了如何在 Symfony 中创建和处理表单。在本教程中,我们不使用 Symfony 表单构建器。有关表单构建器的介绍,请参阅 Symfony 表单构建器教程。
Symfony
Symfony 是一套可重用的 PHP 组件,也是一个用于 Web 项目的 PHP 框架。Symfony 于 2005 年发布为自由软件。Symfony 的最初作者是 Fabien Potencier。Symfony 深受 Spring Framework 的启发。
HTML 表单
HTML 表单用于用户与网站或应用程序之间的交互。它们允许用户向网站发送数据。HTML 表单由一个或多个控件组成。这些控件可以是文本字段、选择框、按钮、复选框或单选按钮。这些控件通常与描述其用途的标签配对。
Symfony 表单示例
在下面的示例中,我们创建一个 HTML 表单。表单数据由 Symfony 控制器处理。
$ symfony new myform
使用 symfony CLI,我们创建一个新的 Symfony 骨架项目。
$ cd myform
我们进入项目目录。
$ composer req annot twig
我们安装了两个模块:annotations 和 twig。
$ composer req maker --dev
我们将 maker 安装到开发依赖项中。
$ php bin/console make:controller HomeController
我们创建一个 HomeController。
<?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 表单的主页。
{% 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 框架的文件。
<!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。
<?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 模板。我们将这两个变量传递给模板。
{% extends 'base.html.twig' %}
{% block title %}Show message{% endblock %}
{% block body %}
{{name}} says: {{message}}
{% endblock %}
最后,我们有了显示消息给用户的模板文件。变量使用 {{}} 语法显示。
$ symfony serve
我们运行应用程序并导航到 localhost:8000。
在本教程中,我们在 Symfony 应用程序中创建并处理了一个简单的 HTML 表单。
列出 所有 Symfony 教程。