形式

编辑该页面

警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 2.7,不再维护。

这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。

形式

处理HTML表单是最常见的一种为web开发人员和具有挑战性的任务。欧宝娱乐app下载地址Symfony集成表单组件,简化处理形式。在这篇文章中,您将构建一个复杂的形式从地上起来,形成图书馆的学习最重要的特性。

请注意

Symf欧宝娱乐app下载地址ony的表单组件是一个独立的库,可以使用Symfony以外的项目。有关更多信息,请参见表单组件文档欧宝体育电话在GitHub上。

创建一个简单的形式

假设你正在构建一个简单的todo列表应用程序,它将需要显示“任务”。因为你的用户将需要编辑和创建任务,你需要建立一个形式。但在你开始之前,首先关注通用任务类表示并存储数据为单个任务:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27日28
/ / src / AppBundle /实体/ Task.php名称空间AppBundle\实体;任务{受保护的美元任务;受保护的美元dueDate;公共函数getTask(){返回美元- >任务;}公共函数setTask(美元任务){美元- >任务=美元任务;}公共函数getDueDate(){返回美元- >dueDate;}公共函数setDueDate(\ DateTime美元dueDate= null){美元- >dueDate =美元dueDate;}}

这个类是一个“plain-old-PHP-object”,因为,到目前为止,它已经与Symfony或任何其他图书馆。欧宝娱乐app下载地址很简单的一个正常的PHP对象里面直接解决问题你的应用程序(例如,需要在应用程序中代表一个任务)。当然,通过本文的结尾,您将能够提交数据任务实例(通过HTML表单),验证其数据并保存到数据库中。

建筑的形式

现在,您已经创建了一个任务类,下一步是创建和渲染实际的HTML表单。在Sy欧宝娱乐app下载地址mfony中,这是通过构建一个form对象,然后呈现在一个模板。现在,从在一个控制器都可以做到这一点:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27
/ / src / AppBundle /控制器/ DefaultController.php名称空间AppBundle\控制器;使用AppBundle\实体\任务;使用欧宝娱乐app下载地址\\FrameworkBundle\控制器\控制器;使用欧宝娱乐app下载地址\组件\HttpFoundation\请求;DefaultController扩展控制器{公共函数newAction(请求美元请求){/ /创建一个任务,给它一些假数据对于这个示例美元任务=任务();美元任务- >setTask (“写博客”);美元任务- >setDueDate (\ DateTime (“明天”));美元形式=美元- >createFormBuilder (美元任务)- >add (“任务”,“文本”)- >add (“dueDate”,“日期”)- >add (“保存”,“提交”,数组(“标签”= >“创建任务”))- >getForm ();返回美元- >呈现(“违约/ new.html.twig”,数组(“形式”= >美元形式- >createView ()));}}

提示

这个例子展示了如何构建表单直接控制器。后,在“形式”部分中,您将学习如何构建表单在一个独立的类,这是推荐为表单变得可重用。

创建一个表单需要相对较少的代码,因为Symfony表单对象构建“形式构建器”。欧宝娱乐app下载地址表单生成器的目的是允许您编写简单的形式“食谱”,实际上做的所有重型起重建筑形式。

在这个示例中,您已经添加了形式——两个字段任务dueDate- - - - - -对应任务dueDate的属性任务类。你也分配每一个“类型”(如。文本,日期),除此之外,确定哪些HTML表单标签(s)呈现。

最后,您添加了一个提交按钮和一个自定义标签向服务器提交表单。

2.3

支持提交按钮是在Symfony 2.3中引入的。欧宝娱乐app下载地址在那之前,你必须手动将按钮添加到表单的HTML。

欧宝娱乐app下载地址Symfony提供了很多内建类型(见不久将讨论形式)。

呈现形式

既然已经创建了表单,下一步是呈现它。这样做是通过一种特殊的“视图”模板(注意对象$形式- > createView ()在上面的控制器),使用一组表单辅助函数:

  • 嫩枝
  • PHP
1 2 3 4
{# app /资源/视图/ / new.html违约。树枝#}{{form_start(形式)}}{{form_widget(形式)}}{{form_end(形式)}}

请注意

这个示例假设您提交表单的“后”请求和相同的URL,这是显示在。稍后您将了解如何更改请求方法和目标URL的形式。

就是这样!仅仅需要三行呈现完整的表单:

form_start(形式)
呈现表单的开始标记,包括当使用添加了正确的enctype属性文件上传。
form_widget(形式)
呈现的所有字段,包括字段元素本身,一个标签和任何验证错误消息的字段。
form_end(形式)
呈现表单的结束标记和尚未呈现的任何领域,以防你呈现的每个字段。这是用于呈现隐藏字段,利用自动CSRF保护

另请参阅

像这是那么容易,不是非常灵活的(还)。通常情况下,你要单独渲染每个表单字段,这样你就可以控制形式的样子。你将学习如何在“如何控制呈现的一种形式吗”一节。

在继续之前,请注意如何呈现任务输入字段的值任务财产的美元的任务对象(即。“写博客”)。这是第一份工作的一种形式:把数据从一个对象转换成适合的格式,会呈现在一个HTML表单。

提示

表单系统是足够聪明来访问受保护的价值任务属性通过getTask ()setTask ()方法任务类。除非一个属性是公共的,它必须有“getter”和“setter”方法,以便表单组件可以get和put数据到财产。对于一个布尔属性,您可以使用一个“伊塞”或“有”的方法(如。发表()hasReminder ())而不是一个getter(如。个短篇()getReminder ())。

处理表单提交

默认情况下,表单将提交一个POST请求回到相同的控制器,使它。

在这里,一种形式的第二份工作是将用户提交的数据对象的属性。为了实现这一点,用户提交的数据必须写入表单对象。添加以下功能控制器:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34
/ /……使用欧宝娱乐app下载地址\组件\HttpFoundation\请求;公共函数newAction(请求美元请求){/ /设置一个新的美元任务对象(删除虚拟数据)美元任务=任务();美元形式=美元- >createFormBuilder (美元任务)- >add (“任务”,“文本”)- >add (“dueDate”,“日期”)- >add (“保存”,“提交”,数组(“标签”= >“创建任务”))- >getForm ();美元形式- >handleRequest (美元请求);如果(美元形式- >isSubmitted () & &美元形式- >isValid ()) {/ / $形式- > getData()提交的值/ /但是,最初的“美元任务”变量也已更新美元任务=美元形式- >getData ();/ /……执行一些操作,比如拯救任务到数据库/ /例如,如果任务是一个学说的实体,保存它!/ / $ entityManager = $ this - > getDoctrine () - > getManager ();/ / $ entityManager - >保存($任务);/ / $ entityManager - >冲洗();返回美元- >redirectToRoute (“task_success”);}返回美元- >呈现(“违约/ new.html.twig”,数组(“形式”= >美元形式- >createView ()));}

谨慎

请注意,createView ()方法应该被称为handleRequest ()被称为。否则,所做的更改* _SUBMIT事件不应用于视图(如验证错误)。

2.3

handleRequest ()方法是在Symfony 2.3中引入的。欧宝娱乐app下载地址在此之前,美元的请求被传递到提交()方法——即弃用策略和在Symfony 3.0将被删除。欧宝娱乐app下载地址对于方法的细节,明白了如何使用submit()函数来处理表单提交

该控制器采用处理形式和一种常见模式有三个可能的路径:

  1. 最初在浏览器中加载页面时,表单创建和渲染。handleRequest ()认识到表单没有提交,什么也不做。isSubmitted ()返回如果表单没有提交。
  2. 当用户提交表单时,handleRequest ()承认这一点,立即回写提交的数据任务dueDate的属性美元的任务对象。然后这个对象验证。如果它是无效的(验证将在下一节中讨论),isValid ()返回再次和形式呈现,但现在验证错误;
  3. 有效数据的用户提交表单时,再次写入表单提交的数据,但这一次isValid ()返回真正的。现在你有机会使用执行一些操作美元的任务对象(例如持久化到数据库)之前将用户重定向到其他页面(例如,一个“谢谢”或“成功”页面)。

    请注意

    重定向用户表单提交成功后可以防止用户能够点击浏览器的“刷新”按钮并转发数据。

另请参阅

如果你需要更多的控制什么时候提交表单或数据传递给它,您可以使用提交()方法。阅读更多关于它如何使用submit()函数来处理表单提交

表单验证

在前面的部分中,您了解了如何有效或无效的表单可以提交数据。在Sy欧宝娱乐app下载地址mfony中,验证应用于底层对象(例如任务)。换句话说,问题不是“形式”是否有效,但是否美元的任务对象是有效的表单之后应用提交的数据。调用$ - > isValid形式()是一个快捷方式,要求吗美元的任务对象是否有效的数据。

验证是通过添加一组规则一个类(称为约束)。看到这,以便添加验证约束任务字段不能为空,dueDate字段不能为空,必须有效的DateTime对象。

  • 注释
  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/ / src / AppBundle /实体/ Task.php名称空间AppBundle\实体;使用欧宝娱乐app下载地址\组件\验证器\约束作为断言;任务{/ * * *@Assert\ NotBlank () * /公共美元任务;/ * * *@Assert* \ NotBlank ()@Assert\类型(" \ DateTime ") * /受保护的美元dueDate;}

就是这样!如果你重新提交表单无效数据,您将看到相应的错误打印的形式。

Symfony的验证是一个非常强大的特性,都有它自己的欧宝娱乐app下载地址专门的文章

由于HTML5,许多本地浏览器可以在客户端上执行特定的验证约束。最常见的验证激活呈现要求属性字段是必需的。对于支持HTML5的浏览器,这将导致原生浏览器消息显示,如果用户试图提交表单字段空白。

生成的形式充分利用这个新特性添加合理的HTML属性触发验证。然而,客户端验证可以通过添加禁用已经属性的形式标签或formnovalidate提交标记。这是特别有用,当你想测试您的服务器端验证约束,但被浏览器阻止了,例如,提交空白领域。

  • 嫩枝
  • PHP
1 2 3 4
{# app /资源/视图/ / new.html违约。树枝#}{{form_start(形式,{attr”:{“已经”:“已经”}})}}{{form_widget(形式)}}{{form_end(形式)}}

内置字段类型

欧宝娱乐app下载地址Symfony是标准与一大群字段类型,覆盖所有常见的表单字段和数据类型你会遇到: