形式

形式

截图

你更喜欢视频教程吗?看看欧宝娱乐app下载地址Symfony表格截图系列

创建和处理HTML表单非常困难,而且是重复的。您需要处理呈现HTML表单字段、验证提交的数据、将表单数据映射到对象等等。欧宝娱乐app下载地址Symfony包含了一个强大的表单特性,它提供了所有这些特性,并为真正复杂的场景提供了更多特性。

安装

在应用中使用欧宝娱乐app下载地址Symfony Flex.,请在使用之前运行此命令以安装表单功能:

1
作曲家需要symfony /形式欧宝娱乐app下载地址

使用

使用Symfony表单时推荐的工作流程如下:欧宝娱乐app下载地址

  1. 建立形式在Symf欧宝娱乐app下载地址ony控制器中或使用专用的表单类;
  2. 呈现形式在模板中,以便用户可以编辑和提交;
  3. 处理形式要验证提交的数据,将其转换为PHP数据并对其进行处理(例如,将其持久化到数据库中)。

下面的部分将详细解释这些步骤。为了使示例更容易理解,所有这些示例都假设您正在构建一个显示“任务”的小Todo列表应用程序。

用户使用Symfony表单创建和编辑任务。欧宝娱乐app下载地址每个任务都是以下内容的一个实例任务班级:

/ / src /实体/ Task.php名称空间应用程序\实体任务受保护的$任务受保护的dueDate美元公共功能getTask()细绳返回这个美元->任务公共功能镶嵌细绳$任务空白这个美元->任务$任务公共功能getDueDate()\ DateTime返回这个美元->dueDate公共功能setDueDate\ DateTimedueDate美元空白这个美元->dueDatedueDate美元

这个类是一个“普通的老php对象”,因为到目前为止,它与Symfony或任何其他库都没有关系。欧宝娱乐app下载地址它是一个普通的PHP对象,直接解决内部的问题你的应用程序(即需要在申请中表示任务)。但你也可以编辑教义的实体以同样的方式。

表格类型

在创建第一个Symfony表单之前,了解“表单类型”的欧宝娱乐app下载地址概念非常重要。在其他项目中,常见的是区分“形式”和“形式字段”。在Sy欧宝娱乐app下载地址mfony中,所有这些都是“表单类型”:

  • 一个单一的<输入type =“text”>表单字段是一种“表单类型”(例如:TextType);
  • 用于输入邮政地址的一组几个HTML字段是“表单类型”(例如,postaladdresstype.);
  • 整个<形式>有多个字段可以编辑的用户配置文件是一个“表单类型”(例如。UserProfileType).

一开始你可能会感到困惑,但很快你就会觉得很自然了。此外,它简化了代码,使“组合”和“嵌入”表单字段更容易实现。

有几十种由Symfony提供的表单类型欧宝娱乐app下载地址你也可以创建自己的表单类型

建筑形式

欧宝娱乐app下载地址Symfony提供了一个“表单构建器”对象,允许您使用连贯的接口描述表单字段。稍后,该构建器将创建用于呈现和处理内容的实际表单对象。

在控制器中创建表单

如果您的控制器从中延伸AbstractController.,可以使用createFormBuilder ()助手:

/ / src /控制器/ TaskController.php名称空间App \控制器使用App \ Entity \任务使用欧宝娱乐app下载地址Symfony \包\ FrameworkBundle \ \ AbstractController控制器使用欧宝娱乐app下载地址Symfony \组件\ \ \ \核心类型的扩展\ DateType形式使用欧宝娱乐app下载地址Symfony \组件\ \ \ \核心类型的扩展\ SubmitType形式使用欧宝娱乐app下载地址Symfony \组件\ \ \ \核心类型的扩展\ TextType形式使用欧宝娱乐app下载地址symfony \ component \ httpfoundation \请求使用欧宝娱乐app下载地址Symfony \ HttpFoundation \ \组件响应TaskController扩展AbstractController.公共功能新的请求美元的请求响应//创建一个任务对象并初始化一些数据$任务新的任务();$任务->镶嵌“写一篇博客”);$任务->setDueDate新的\ DateTime“明天”));美元的形式这个美元->CreateFoomBuilder.$任务->添加'任务'TextType::->添加“dueDate”DateType::->添加“保存”SubmitType::'标签'=>“创建任务”])->getForm();/ /……

如果您的控制器没有从AbstractController.,你需要获取控制器中的服务并使用createBuilder ()的方法Form.Factory.服务。

在此示例中,您已添加两个字段到您的表单 -任务dueDate-对应于任务dueDate属性任务类。你也给每个a表单类型(例如。TextTypeDateType),由其完全合格的类名代​​表。最后,您添加了一个带有自定义标签的提交按钮,用于将表单提交到服务器。

创建表单类

欧宝娱乐app下载地址Symfony建议在控制器中放置尽可能少的逻辑。这就是为什么将复杂的表单转移到专用的类中比在控制器动作中定义它们更好的原因。此外,类中定义的表单可以在多个操作和服务中重用。

表格课程是表格类型实现欧宝娱乐app下载地址symfony \ component \ form \ form typeInterface.但是,最好延伸欧宝娱乐app下载地址Symfony \组件\ \ AbstractType形式,它已经实现了该接口,并提供了一些实用工具:

// src / form / type / tasktype.php名称空间应用程序\ form \类型使用欧宝娱乐app下载地址Symfony \组件\ \ AbstractType形式使用欧宝娱乐app下载地址Symfony \组件\ \ \ \核心类型的扩展\ DateType形式使用欧宝娱乐app下载地址Symfony \组件\ \ \ \核心类型的扩展\ SubmitType形式使用欧宝娱乐app下载地址Symfony \组件\ \ \ \核心类型的扩展\ TextType形式使用欧宝娱乐app下载地址Symfony \组件\ \ FormBuilderInterface形式TaskType扩展AbstractType.公共功能建筑物FormBuilderInterface美元的建造者数组选择美元空白美元的建造者->添加'任务'TextType::->添加“dueDate”DateType::->添加“保存”SubmitType::

提示

安装makerbundle.控件生成表单类:形式:注册表单命令。

表单类包含创建任务表单所需的所有方向。在从AbstractController.,可以使用createForm ()Helper(否则,请使用创造()的方法Form.Factory.服务):

/ / src /控制器/ TaskController.php名称空间App \控制器使用应用\ \ \ TaskType型形式/ /……TaskController扩展AbstractController.公共功能新的()响应//创建一个任务对象并初始化一些数据$任务新的任务();$任务->镶嵌“写一篇博客”);$任务->setDueDate新的\ DateTime“明天”));美元的形式这个美元->创建TaskType::$任务);/ /……

每个表单都需要知道包含底层数据的类的名称(例如,App \ Entity \任务).通常,这只是根据传递给第二个参数的对象来猜测的createForm ()(IE。$任务).以后,当你开始的时候嵌入形式,这将不再足够。

所以,虽然并非总是必要的,但明确地指定了这一般是一个好主意data_class.选项,添加以下到您的表单类型类:

// src / form / type / tasktype.php名称空间应用程序\ form \类型使用App \ Entity \任务使用欧宝娱乐app下载地址Symfony \ \ OptionsResolver \ OptionsResolver组件/ /……TaskType扩展AbstractType./ /……公共功能configureOptions.OptionsResolver美元的解析器空白美元的解析器->setdefaults.([“data_class”=>任务::]);

渲染形式

现在已经创建了表单,下一步是呈现它。属性代替将整个表单对象传递给模板,而使用createview()方法以表单的可视表示形式构建另一个对象:

/ / src /控制器/ TaskController.php名称空间App \控制器使用App \ Entity \任务使用应用\ \ \ TaskType型形式使用欧宝娱乐app下载地址Symfony \包\ FrameworkBundle \ \ AbstractController控制器使用欧宝娱乐app下载地址symfony \ component \ httpfoundation \请求使用欧宝娱乐app下载地址Symfony \ HttpFoundation \ \组件响应TaskController扩展AbstractController.公共功能新的请求美元的请求响应$任务新的任务();/ /……美元的形式这个美元->创建TaskType::$任务);返回这个美元->使成为'任务/ new.html.twig''形式'=>美元的形式->createView(),]);

然后,使用一些表单辅助函数呈现表单内容:

1 2
{/任务/ new.html #模板。树枝#}{{形式形式}}

就是这样!的形式()函数显示所有字段<形式>开始和结束标签。默认情况下,表单方法是帖子目标URL显示表单的同样,但是你可以改变两者

注意如何渲染任务输入字段具有值的值任务财产的$任务对象(即“写博客文章”)。这是一个表单的第一份作用:从对象中获取数据并将其转换为适合以HTML表单呈现的格式。

提示

表单系统足够智能以访问受保护的值任务属性通过getTask ()setTask ()方法任务类。除非是公共财产,否则必须有一个“getter”和“setter”方法,以便Symfony可以获取并将数据放到属性欧宝娱乐app下载地址中。对于一个布尔属性,你可以使用" isser "或" hasser "方法(例如:发表()hasReminder ())而不是getter(例如:个短篇()getReminder()).

如这种渲染是短暂的,它不是很灵活。通常,您需要更多控制整个形式或其某些领域的外观。例如,感谢与Symfony表单的引导程序4集成欧宝娱乐app下载地址你可以设置这个选项来生成与Bootstrap 4 CSS框架兼容的表单:

  • yaml.
    1 2 3.
    #配置/包/ twig.yaml嫩枝form_themes.'bootstrap_4_layout.html.twig'
  • XML.
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
    <!--config/packages/twig.xml --><?XML Version =“1.0”编码=“UTF-8”?><容器xmlns =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi =“http://www.w3.org/2001/XMLSchema-instance”XMLNS:Twig =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/twig”xsi: schemaLocation =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services.https://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsdhttp://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/twighttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/twig/twig-1.0.xsd“><树枝:配置><树枝:form-theme >bootstrap_4_layout.html.twig< /枝:form-theme ><! -  ...  - >< /枝:配置>
  • PHP
    1 2 3 4 5 6 7 8
    / /配置/包/ twig.php美元的容器->loadfromextension.“树枝”“form_themes”=>'bootstrap_4_layout.html.twig'],/ /……]);

内置Symfony欧宝娱乐app下载地址表单主题包括Bootstrap 3和4以及基金会5和6.您也可以创建自己的Symfony表单主题欧宝娱乐app下载地址

除了表单主题,Symfony还允许您欧宝娱乐app下载地址自定义字段的呈现方式使用多个函数分别呈现每个字段部分(小部件、标签、错误、帮助消息等)。

处理形式

推荐的表格处理方式就是使用一个动作来呈现表单和处理表单提交。您可以使用单独的操作,但是使用一个操作可以简化一切,同时保持代码的简洁和可维护性。

处理表单意味着将用户提交的数据转换回对象的属性。要实现这一点,必须将来自用户的提交的数据写入表单对象:

/ / src /控制器/ TaskController.php/ /……使用欧宝娱乐app下载地址symfony \ component \ httpfoundation \请求TaskController扩展AbstractController.公共功能新的请求美元的请求响应//只是设置一个新鲜的$任务对象(删除示例数据)$任务新的任务();美元的形式这个美元->创建TaskType::$任务);美元的形式->handleRequest美元的请求);如果美元的形式->issubmited.()& &美元的形式->isValid())// $ form-> getdata()保存提交的值//但是,原来的' $task '变量也被更新了$任务美元的形式->getdata.();// ...执行一些操作,例如将任务保存到数据库//例如,如果Task是一个Doctrine实体,保存它!// $ EntityManager = $ this-> getdoctrine() - > getManager();/ / entityManager - >保存($任务);/ / entityManager - >冲洗();返回这个美元->redirectToRoute“task_success”);返回这个美元->使成为'任务/ new.html.twig''形式'=>美元的形式->createView(),]);

这个控制器遵循处理表单的常见模式,有三种可能的路径:

  1. 在浏览器中初始加载页面时,表单还没有提交形式- > isSubmitted ()返回.表单被创建并呈现;
  2. 当用户提交表单时,handleRequest ()认识到这一点,并立即将提交的数据写回任务dueDate属性$任务对象。然后验证该对象(验证将在下一节中解释)。如果无效,isValid ()返回该表单再次呈现,但现在具有验证错误;
  3. 当用户提交具有有效数据的表单时,提交的数据再次写入表单,但这一次isValid ()返回真正的.现在您有机会使用$任务在将用户重定向到其他一些页面之前(例如,持续到数据库)(例如,“谢谢”或“成功”页面);

笔记

在表单成功提交后重定向用户是一种最佳实践,它可以防止用户点击浏览器的“刷新”按钮并重新发布数据。

警告

createview()方法应被调用handleRequest ()被称为。否则,当使用形成事件中完成的更改*_提交事件不会应用于视图(如验证错误)。

另请参阅

如果您需要对提交表单的确切时间或传递给表单的数据进行更多控制,您可以这样做使用submit()方法来处理表单提交

提示

如果需要在不同的模板中呈现和处理相同的表单,请使用使成为()函数嵌入到控制器处理形式:

1
{{使成为控制器'app \\ controller \\ taskcontroller :: new'))}}

验证表格

在前一节中,您了解了如何使用有效或无效数据提交表单。在Sy欧宝娱乐app下载地址mfony中,问题不在于“形式”是否有效,而在于底层对象($任务在这个例子中)在表单将提交的数据应用到它之后是有效的。调用$ form-> isvalid()请问捷径是什么$任务对象,无论其是否具有有效数据。

在使用验证之前,请在您的应用程序中添加对它的支持:

1
作曲家需要symfony /验证器欧宝娱乐app下载地址

通过添加一组规则,调用(验证)约束,对类进行验证。您可以将它们添加到实体类或表单类。

要查看第一个方法 - 为实体添加约束 - 在Actity中,添加验证约束,以便任务字段不能为空,并且dueDate字段不能为空,并且必须是有效的DateTime对象。

  • 注释
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
    / / src /实体/ Task.php名称空间应用程序\实体使用欧宝娱乐app下载地址Symfony \组件\验证器\约束作为断言任务/ * ** @assert \ notblank* /公共$任务/ * ** @assert \ notblank* @assert \ type(“\ datetime”)* /受保护的dueDate美元
  • 属性
    12 3 4 5 6 7 8 9 10 11 12 13 14
    / / src /实体/ Task.php名称空间应用程序\实体使用欧宝娱乐app下载地址Symfony \组件\验证器\约束作为断言任务#[assert \ notblank]公共$任务#[assert \ notblank]#[断言\类型(\ DateTime::类))受保护的dueDate美元
  • yaml.
    1 2 3 4 5 6 7 8
    #配置/验证器/ validation.yamlApp \ Entity \任务属性任务-NotBlankdueDate-NotBlank-类型\ DateTime
  • XML.
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
    <! - 配置/ validator / validation.xml  - ><?XML Version =“1.0”编码=“UTF-8”?><约束映射xmlns =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/constraint-mapping”xmlns: xsi =“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/constraint-mappinghttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/constraint-mapping/constraint-mapping--.0.xsd“>name =“应用程序实体\ \任务”><属性name =“任务”><约束name =“不发布”/><属性name =“到期日”><约束name =“不发布”/><约束name =“类型”>\ DateTime> < /约束类> < /
  • PHP
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
    / / src /实体/ Task.php名称空间应用程序\实体使用欧宝娱乐app下载地址Symfony \ \组件验证器\ \ NotBlank约束使用欧宝娱乐app下载地址Symfony \验证器\约束\ \组件类型使用欧宝娱乐app下载地址symfony \ component \ validator \ mapping \ classmetadata任务/ /……公共静止的功能loadValidatorMetadataClassMetadata$元数据空白$元数据->AddPropertyConstraint.'任务'新的NotBlank());$元数据->AddPropertyConstraint.“dueDate”新的NotBlank());$元数据->AddPropertyConstraint.“dueDate”新的类型\ DateTime::);

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

要查看第二种方法—向表单添加约束—并了解关于验证约束的更多信息,请参阅欧宝娱乐app下载地址Symfony验证文档欧宝体育电话

表单验证消息

5.2新版功能:legacy_error_messages选择在Symfony 5.2中介绍欧宝娱乐app下载地址

表单类型具有比验证约束提供的更清晰和用户友好的默认错误消息。启用这些新消息设置legacy_error_messages选择

  • yaml.
    1 2 3 4
    #配置/包/ framework.yaml框架形式legacy_error_messages
  • XML.
    12 3 4 5 6 7 8 9 10 11 12 13 14
    <! - 配置/包/ framework.xml  - ><?XML Version =“1.0”编码=“UTF-8”?><容器xmlns =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi =“http://www.w3.org/2001/XMLSchema-instance”xmlns:框架=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony”xsi: schemaLocation =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services.https://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsdhttp://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony.https://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony/symfony-1.0.xsd“><框架:配置><框架:形式legacy-error-messages =“假”/>< /框架:配置>
  • PHP
    1 2 3 4 5 6
    / /配置/包/ framework.php美元的容器->loadfromextension.“框架”'形式'=>“legacy_error_messages”=>],]);

其他常见的表格功能

向表单传递选项

如果你在类中创建表单,当在控制器中构建表单时,您可以将自定义选项作为的第三个可选参数传递给它createForm ()

/ / src /控制器/ TaskController.php名称空间App \控制器使用应用\ \ \ TaskType型形式/ /……TaskController扩展AbstractController.公共功能新的()响应$任务新的任务();//使用一些PHP逻辑来决定是否需要此表单字段$ duedateisrequired.......美元的形式这个美元->创建TaskType::$任务“require_due_date”=>$ duedateisrequired.]);/ /……

如果您尝试使用表单,您会看到错误消息:require_due_date选项不存在。这是因为表单必须使用configureOptions ()方法:

// src / form / type / tasktype.php名称空间应用程序\ form \类型使用欧宝娱乐app下载地址Symfony \ \ OptionsResolver \ OptionsResolver组件/ /……TaskType扩展AbstractType./ /……公共功能configureOptions.OptionsResolver美元的解析器空白美元的解析器->setdefaults.([// ......,“require_due_date”=>]);//您还可以定义允许的类型,允许值和// OptionsEresolver组件支持的任何其他功能美元的解析器->setAllowedTypes“require_due_date”'bool');

现在,您可以在内部使用此新表单选项buildForm ()方法:

// src / form / type / tasktype.php名称空间应用程序\ form \类型使用欧宝娱乐app下载地址Symfony \组件\ \ AbstractType形式使用欧宝娱乐app下载地址Symfony \组件\ \ \ \核心类型的扩展\ DateType形式使用欧宝娱乐app下载地址Symfony \组件\ \ FormBuilderInterface形式TaskType扩展AbstractType.公共功能建筑物FormBuilderInterface美元的建造者数组选择美元空白美元的建造者/ /……->添加“dueDate”DateType::“要求”=>选择美元“require_due_date”],])/ /……

表单类型选项

每一个表单类型具有配置它的许多选项,如图所示欧宝娱乐app下载地址Symfony形式类型引用.两个常用的选项是必需的标签

必需的选项

最常见的选择是必需的选项可以应用于任何字段。默认情况下,此选项设置为真正的,这意味着HTML5就绪的浏览器将需要在提交表单之前填写所有字段。

如果你也不想这样的话禁用客户端验证对于整个表格或设置必需的选择在一个或多个领域:

->添加“dueDate”DateType::“要求”=>])

必需的选项不执行任何服务器端验证。如果用户为该字段提交空白值(例如,使用旧浏览器或Web服务),除非您也使用Symfony,否则将被接受为有效值欧宝娱乐app下载地址NotBlankNotNull验证约束。

标签选项

默认情况下,表单字段的标签是人性化物业名称的版本(用户->用户postalAddress->邮政地址).设定标签选项用于显式定义字段的标签:

->添加“dueDate”DateType:://将其设置为false以显示此字段的标签'标签'=>'以前完成'])

提示

默认情况下,<标识>必需字段的标记用必需的CSS类,所以你可以通过应用CSS样式显示星号:

1 2 3.
标签必需的内容“*”

更改操作和HTTP方法

默认情况下,表单将通过HTTP POST请求提交到呈现表单的URL。在控制器中构建表单时,使用setAction ()setmethod()改变这个方法:

/ / src /控制器/ TaskController.php名称空间App \控制器/ /……使用欧宝娱乐app下载地址Symfony \包\ FrameworkBundle \ \ AbstractController控制器使用欧宝娱乐app下载地址Symfony \组件\ \ \ \核心类型的扩展\ DateType形式使用欧宝娱乐app下载地址Symfony \组件\ \ \ \核心类型的扩展\ SubmitType形式使用欧宝娱乐app下载地址Symfony \组件\ \ \ \核心类型的扩展\ TextType形式TaskController扩展AbstractController.公共功能新的()响应/ /……美元的形式这个美元->CreateFoomBuilder.$任务->setAction这个美元->generateurl.“target_route”))->setMethod'得到'/ /……->getForm();/ /……

在类中构建表单时,将动作和方法作为表单选项传递:

/ / src /控制器/ TaskController.php名称空间App \控制器使用应用\ \ TaskType形式使用欧宝娱乐app下载地址Symfony \包\ FrameworkBundle \ \ AbstractController控制器/ /……TaskController扩展AbstractController.公共功能新的()响应/ /……美元的形式这个美元->创建TaskType::$任务“行动”=>这个美元->generateurl.“target_route”),“方法”=>'得到']);/ /……

最后,您可以通过将它们传递给模板中的操作和方法形式()或者form_start ()辅助功能:

1 2
{/任务/ new.html #模板。树枝#}{{form_start形式“行动”小路“target_route”),“方法”'得到'})}}

笔记

如果表单的方法不是得到帖子,但补丁删除,s欧宝娱乐app下载地址ymfony将插入一个名称的隐藏字段_method它存储了这个方法。表格将以正常方式提交帖子要求,但是欧宝娱乐app下载地址Symfony的路由是否能够检测到_method参数并将其解释为一个补丁删除请求。的http_method_override必须启用选项以用于此工作。

更改表单名称

如果检查所呈现表单的HTML内容,您将看到<形式>名称和字段名称是从类型类名称(例如。<形式名称=“任务”...><选择name =“任务[duedate] [日期] [月]”...>).

如果要修改此,请使用CreateNamed()方法:

/ / src /控制器/ TaskController.php名称空间App \控制器使用应用\ \ TaskType形式使用欧宝娱乐app下载地址Symfony \包\ FrameworkBundle \ \ AbstractController控制器/ /……TaskController扩展AbstractController.公共功能新的()响应$任务......美元的形式这个美元->得到'form.factory'->诱殖的“my_name”TaskType::$任务);/ /……

您甚至可以通过将其设置为空字符串来完全抑制名称。

HTML验证客户端

由于HTML5,许多浏览器本地可以在客户端本身强制执行某些验证约束。通过添加一个最常见的验证是激活的必需的属性在必填字段上。对于支持HTML5的浏览器,如果用户尝试将具有该字段空白的表单提交表单,则会导致本机浏览器消息。

生成的表单通过添加触发验证的敏感HTML属性,充分利用了这个新特性。但是,可以通过添加已经归因于这件<形式>标签或formnovalidate提交标记。当您想要测试服务器端验证约束时,这尤其有用,但是浏览器从例如提交空白字段时被浏览器阻止。

1 2 3 4
{/任务/ new.html #模板。树枝#}{{form_start形式'attr'“已经”“已经”}})}}}{{form_widget形式}}{{form_end形式}}

表单类型猜测

如果表单处理的对象包含验证约束,那么Symfony可以自检该元数据,以猜测字段的类型并为您设置字段。欧宝娱乐app下载地址在上面的例子中,Symfony可以从验证规则欧宝娱乐app下载地址中猜测任务字段是正常的TextType场和dueDate字段是一个DateType场地。

在构建表单时,省略add ()方法或通过来启用Symfony的“猜测机制”欧宝娱乐app下载地址:

// src / form / type / tasktype.php名称空间应用程序\ form \类型使用欧宝娱乐app下载地址Symfony \组件\ \ AbstractType形式使用欧宝娱乐app下载地址Symfony \组件\ \ \ \核心类型的扩展\ DateType形式使用欧宝娱乐app下载地址Symfony \组件\ \ \ \核心类型的扩展\ SubmitType形式使用欧宝娱乐app下载地址Symfony \组件\ \ \ \核心类型的扩展\ TextType形式使用欧宝娱乐app下载地址Symfony \组件\ \ FormBuilderInterface形式TaskType扩展AbstractType.公共功能建筑物FormBuilderInterface美元的建造者数组选择美元空白美元的建造者//如果不定义现场选项,则可以省略第二个参数->添加'任务'//如果你定义字段选项,传递NULL作为第二个参数->添加“dueDate”“要求”=>])->添加“保存”SubmitType::

警告

使用特定的时表格验证组,现场类型猜测仍将考虑全部验证您的字段类型时验证约束(包括不使用验证组的一部分的约束)。

表单类型选项猜测

当对某些字段启用猜测机制时(即省略或传递)作为第二个论点add ()),除其形式类型外,以下选项也可猜测:

必需的
必需的可以基于验证规则(即,字段)猜测选项NotBlankNotNull)或Doctrine元数据(即字段可以为空).这非常有用,因为您的客户端验证将自动匹配您的验证规则。
最长长度
如果该字段是某种文本字段,那么最长长度选项属性可以从验证约束(如果长度范围是用)还是来自学说元数据(通过字段的长度)。

如果您想更改其中一个猜测值,请通过在选项字段阵列中传递选项来覆盖它:

->添加'任务''attr'=>'最长长度'=>4]])

另请参阅

除了猜测表单类型,Symfony也猜测欧宝娱乐app下载地址验证约束如果你使用的是教义实体。读验证对象更多信息指南。

未映射的字段

当通过表单编辑对象时,所有表单字段都被认为是对象的属性。窗体上任何不存在于对象上的字段都将引发异常。

如果需要表单中不存储在对象中的额外字段(例如添加“我同意这些条款”复选框),设置映射选择在这些领域:

/ /……使用欧宝娱乐app下载地址Symfony \组件\ \ FormBuilderInterface形式TaskType扩展AbstractType.公共功能建筑物FormBuilderInterface美元的建造者数组选择美元空白美元的建造者->添加'任务'->添加“dueDate”->添加“agreeTerms”CheckboxType::'映射'=>])->添加“保存”SubmitType::

这些“未映射字段”可以在控制器中设置和访问:

美元的形式->得到“agreeTerms”->getdata.();美元的形式->得到“agreeTerms”->setData真正的);

此外,如果在提交的数据中没有包含的表单上有任何字段,则将显式设置这些字段

这项工作包括代码样本,是在a下获得的许可创作共用BY-SA 3.0许可证。