形式

编辑该页面

警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 5.2,不再维护。

这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。

形式

截屏视频

你喜欢视频教程?检查ob娱乐下载Symfony形式视频系列

创建和处理HTML表单是困难的和重复的。你需要处理呈现HTML表单字段,提交验证数据,将表单数据映射到对象和更多。ob娱乐下载Symfony包括形式的一个非常强大的特性,提供所有这些功能和更多真正复杂的场景。

安装

在应用程序中使用ob娱乐下载Symfony Flex运行这个命令,安装形式功能在使用它:

1
美元作曲家需要symfony /形式ob娱乐下载

使用

推荐的工作流程在处理Symfony形式如下:ob娱乐下载

  1. 构建表单在Symfob娱乐下载ony控制器或使用一个专用的形式类;
  2. 呈现形式在一个模板,这样用户可以编辑并提交;
  3. 流程表单验证提交的数据,将其转换为PHP数据并做一些(例如保存在数据库中)。

每一个步骤是在接下来的章节中详细解释。简化的例子,他们都假设您正在构建一个小型Todo列表应用程序显示“任务”。

用户使用Symfony创建和编辑任务形式。ob娱乐下载每个任务是这样的一个实例任务类:

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 /实体/ Task.php名称空间应用程序\实体;任务{受保护的美元任务;受保护的美元dueDate;公共函数getTask():字符串{返回美元- >任务;}公共函数setTask(字符串美元任务):无效{美元- >任务=美元任务;}公共函数getDueDate():? \DateTime{返回美元- >dueDate;}公共函数setDueDate(? \ DateTime美元dueDate):无效{美元- >dueDate =美元dueDate;}}

这个类是一个“plain-old-PHP-object”,因为,到目前为止,它已经与Symfony或任何其他图书馆。ob娱乐下载这是一个普通的PHP对象里面直接解决问题你的应用程序(例如,需要在应用程序中代表一个任务)。但是你也可以编辑教义的实体以同样的方式。

表单类型

创建您的第一个Symfony表单之前,重要的是要理解“ob娱乐下载表单类型”的概念。在其他项目中,通常区分“形式”和“表单字段”。在Syob娱乐下载mfony中,所有的“形式类型”:

  • 一个单一的< input type = " text " >表单字段是一种“形式”(如TextType);
  • 一组多个HTML字段用于输入邮寄地址是(如“表单类型”。PostalAddressType);
  • 一个完整的<形式>与多个字段编辑用户概要文件(如“表单类型”。UserProfileType)。

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

有数万Symfony提供的表单类型ob娱乐下载你也可以创建自己的类型

建筑形式

ob娱乐下载Symfony提供了一个“表单生成器”对象允许您使用连贯接口描述表单字段。之后,这个builder创建实际的表单对象用于呈现内容和过程。

在控制器中创建表单

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

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
/ / src /控制器/ TaskController.php名称空间应用程序\控制器;使用应用程序\实体\任务;使用ob娱乐下载\\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\形式\扩展\核心\类型\DateType;使用ob娱乐下载\组件\形式\扩展\核心\类型\SubmitType;使用ob娱乐下载\组件\形式\扩展\核心\类型\TextType;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpFoundation\响应;TaskController扩展AbstractController{公共函数(请求美元请求):响应{/ /创建一个任务对象并初始化一些数据对于这个示例美元任务=任务();美元任务- >setTask (“写博客”);美元任务- >setDueDate (\ DateTime (“明天”));美元形式=美元- >createFormBuilder (美元任务)- >add (“任务”,TextType::类)- >add (“dueDate”,DateType::类)- >add (“保存”,SubmitType::类,“标签”= >“创建任务”])- >getForm ();/ /……}}

如果你的控制器不延长AbstractController,你需要在你的控制器获取服务并使用createBuilder ()的方法form.factory服务。

在这个示例中,您已经添加了形式——两个字段任务dueDate- - - - - -对应任务dueDate的属性任务类。你还分配每一个表单类型(如。TextTypeDateType),由它的完全限定类名。最后,您添加了一个提交按钮和一个自定义标签向服务器提交表单。

创建表单类

ob娱乐下载Symfony建议把尽可能少的逻辑控制器。这就是为什么更好的复杂的形式移动到专用类而不是定义在控制器动作。此外,表单中定义的类可以重用在多个操作和服务。

表单类表单类型实现FormTypeInterface。然而,更好的延长AbstractType已经实现了接口和提供了一些实用程序:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
/ / src /形式/类型/ TaskType.php名称空间应用程序\形式\类型;使用ob娱乐下载\组件\形式\AbstractType;使用ob娱乐下载\组件\形式\扩展\核心\类型\DateType;使用ob娱乐下载\组件\形式\扩展\核心\类型\SubmitType;使用ob娱乐下载\组件\形式\扩展\核心\类型\TextType;使用ob娱乐下载\组件\形式\FormBuilderInterface;TaskType扩展AbstractType{公共函数buildForm(FormBuilderInterface美元构建器数组,美元选项):无效{美元构建器- >add (“任务”,TextType::类)- >add (“dueDate”,DateType::类)- >add (“保存”,SubmitType::类);}}

提示

安装MakerBundle在您的项目中生成表单类使用:形式:注册表单命令。

表单类包含所需的所有方向创建任务表单。在控制器的扩展AbstractController,可以使用createForm ()助手(否则,使用create ()的方法form.factory服务):

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
/ / src /控制器/ TaskController.php名称空间应用程序\控制器;使用应用程序\形式\类型\TaskType;/ /……TaskController扩展AbstractController{公共函数():响应{/ /创建一个任务对象并初始化一些数据对于这个示例美元任务=任务();美元任务- >setTask (“写博客”);美元任务- >setDueDate (\ DateTime (“明天”));美元形式=美元- >createForm (TaskType::类,美元任务);/ /……}}

每个表单需要知道类的名称,底层数据(例如应用实体\ \任务)。通常情况下,这仅仅是猜测的基于对象传递给第二个参数createForm ()(即。美元的任务)。之后,当你开始嵌入形式这将不再是足够的。

所以,虽然并不总是必要的,通常是一个好主意来显式地指定data_class选择通过添加以下表单类型类:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/ / src /形式/类型/ TaskType.php名称空间应用程序\形式\类型;使用应用程序\实体\任务;使用ob娱乐下载\组件\OptionsResolver\OptionsResolver;/ /……TaskType扩展AbstractType{/ /……公共函数configureOptions(OptionsResolver美元解析器):无效{美元解析器- >setDefaults ([“data_class”= >任务::类,]);}}

呈现形式

既然已经创建了表单,下一步是呈现它。而不是整个表单对象传递给模板,使用createView ()方法建立另一个对象的可视化表示形式:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日
/ / src /控制器/ TaskController.php名称空间应用程序\控制器;使用应用程序\实体\任务;使用应用程序\形式\类型\TaskType;使用ob娱乐下载\\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpFoundation\响应;TaskController扩展AbstractController{公共函数(请求美元请求):响应{美元任务=任务();/ /……美元形式=美元- >createForm (TaskType::类,美元任务);返回美元- >呈现(“任务/ new.html.twig”,(“形式”= >美元形式- >createView ()));}}

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

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

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

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

提示

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

这么短的渲染,它不是很灵活。通常,你需要更多的控制整个表单或它的一些字段如何看。例如,由于引导4与Symfony的集成形式ob娱乐下载你可以设置这个选项来生成兼容形式引导4 CSS框架:

  • YAML
  • XML
  • PHP
1 2 3
#配置/包/ twig.yaml枝:form_themes:(“bootstrap_4_layout.html.twig”)

内置Symfonyob娱乐下载形式主题包括引导3和4以及基金会5和6。你也可以创建自己的Symfony形式的主ob娱乐下载题

除了主题形式,Symfony允许你ob娱乐下载自定义字段的方式呈现分别与多个函数呈现每个字段部分(小部件、标签错误,帮助信息,等等)。

处理形式

推荐的方法处理形式是使用一个单一动作呈现形式和处理表单提交。你可以使用单独的行动,但使用一个行动简化一切,同时保持代码简洁和易于维护。

处理表单意味着将用户提交的数据对象的属性。为了实现这一点,用户提交的数据必须写入表单对象:

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
/ / src /控制器/ TaskController.php/ /……使用ob娱乐下载\组件\HttpFoundation\请求;TaskController扩展AbstractController{公共函数(请求美元请求):响应{/ /设置一个新的美元任务对象(删除示例数据)美元任务=任务();美元形式=美元- >createForm (TaskType::类,美元任务);美元形式- >handleRequest (美元请求);如果(美元形式- >isSubmitted () & &美元形式- >isValid ()) {/ / $形式- > getData()提交的值/ /但是,最初的“美元任务”变量也已更新美元任务=美元形式- >getData ();/ /……执行一些操作,比如拯救任务到数据库/ /例如,如果任务是一个学说的实体,保存它!/ / $ entityManager = $ this - > getDoctrine () - > getManager ();/ / $ entityManager - >保存($任务);/ / $ entityManager - >冲洗();返回美元- >redirectToRoute (“task_success”);}返回美元- >呈现(“任务/ new.html.twig”,(“形式”= >美元形式- >createView ()));}}

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

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

请注意

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

谨慎

createView ()方法应该被称为handleRequest ()被称为。否则,当使用形成事件,做的变化* _SUBMIT事件不会被应用到视图(如验证错误)。

另请参阅

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

提示

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

1
{{渲染(控制器(“控制器应用\ \ \ \ TaskController:新的“))}}

验证表单

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

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

1
美元作曲家需要symfony /验证器ob娱乐下载

验证是通过添加一组规则,叫做(验证)约束,一个类。您可以将它们添加到实体类或类的形式。

看到第一种方法——实体添加约束作用,添加验证约束,这样任务字段不能为空,而dueDate字段不能为空,必须是有效的DateTime对象。

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

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

看到第二种方法——约束添加到表单,以了解更多关于验证约束,请参考ob娱乐下载Symfony验证文档欧宝官网下载app

表单验证消息

5.2

legacy_error_messages选项是在Symfony 5.2中引入的ob娱乐下载

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

  • YAML
  • XML
  • PHP
1 2 3 4
#配置/包/ framework.yaml框架:形式:legacy_error_messages:

其他常见功能

通过选择形式

如果你创建形式类构建中的表单时,控制器可以通过自定义选项的第三个可选参数createForm ():

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/ / src /控制器/ TaskController.php名称空间应用程序\控制器;使用应用程序\形式\类型\TaskType;/ /……TaskController扩展AbstractController{公共函数():响应{美元任务=任务();/ /使用一些PHP逻辑来决定是否需要这个表单字段美元dueDateIsRequired=……;美元形式=美元- >createForm (TaskType::类,美元任务,(“require_due_date”= >美元dueDateIsRequired]);/ /……}}

如果你现在尝试使用表单,您将看到一条错误消息:选择“require_due_date”并不存在。这是因为形式必须声明所有的选项他们接受使用configureOptions ()方法:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/ / src /形式/类型/ TaskType.php名称空间应用程序\形式\类型;使用ob娱乐下载\组件\OptionsResolver\OptionsResolver;/ /……TaskType扩展AbstractType{/ /……公共函数configureOptions(OptionsResolver美元解析器):无效{美元解析器- >setDefaults ([/ /……,“require_due_date”= >]);/ /您还可以定义允许的类型,允许的值/ /其他OptionsResolver组件支持的特性美元解析器- >setAllowedTypes (“require_due_date”,“bool”);}}

现在您可以使用这个新形式选项内buildForm ()方法:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/ / src /形式/类型/ TaskType.php名称空间应用程序\形式\类型;使用ob娱乐下载\组件\形式\AbstractType;使用ob娱乐下载\组件\形式\扩展\核心\类型\DateType;使用ob娱乐下载\组件\形式\FormBuilderInterface;TaskType扩展AbstractType{公共函数buildForm(FormBuilderInterface美元构建器数组,美元选项):无效{美元构建器/ /……- >add (“dueDate”,DateType::类,“要求”= >美元选项(“require_due_date”)));}/ /……}

表单类型选项

每一个表单类型有许多选项来配置它,解释的吗ob娱乐下载Symfony形式类型引用。两个常用的选项要求标签

要求选项

最常见的选项要求选项,它可以应用于任何领域。默认情况下,此选项设置为真正的,这意味着准备好了支持html5技术的浏览器需要在提交表单之前填写所有字段。

如果你不希望这种行为禁用客户端验证整个表单或设置要求选项在一个或多个领域:

1 2 3
- >add (“dueDate”,DateType::类,“要求”= >,)

要求选择不执行任何服务器端验证。如果一个用户提交一个空白字段的值(用旧浏览器或web服务,例如),它会被接受作为一个有效的值,除非你也使用Symfony的ob娱乐下载NotBlankNotNull验证约束。

标签选项

默认情况下,表单字段的标签人性化的版本的属性名(用户- >用户;postalAddress- >邮寄地址)。设置标签选择字段来显式地定义自己的标签:

1 2 3 4
- >add (“dueDate”,DateType::类,/ /设置为FALSE为这个字段不显示标签“标签”= >之前完成的,)

提示

默认情况下,<标识>标签呈现一个必需的字段要求CSS类,因此您可以显示星号通过应用CSS样式:

1 2 3
标签.required:在{内容:“*”;}

改变行动和HTTP方法

默认情况下,表单将提交通过一个HTTP POST请求的URL相同形式呈现。在构建控制器的形式,使用setAction ()setMethod ()改变这种方法:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24
/ / src /控制器/ TaskController.php名称空间应用程序\控制器;/ /……使用ob娱乐下载\\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\形式\扩展\核心\类型\DateType;使用ob娱乐下载\组件\形式\扩展\核心\类型\SubmitType;使用ob娱乐下载\组件\形式\扩展\核心\类型\TextType;TaskController扩展AbstractController{公共函数():响应{/ /……美元形式=美元- >createFormBuilder (美元任务)- >setAction (美元- >generateUrl (“target_route”))- >setMethod (“得到”)/ /……- >getForm ();/ /……}}

当建筑形式在一个类,通过行动和方法形式选择:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/ / src /控制器/ TaskController.php名称空间应用程序\控制器;使用应用程序\形式\TaskType;使用ob娱乐下载\\FrameworkBundle\控制器\AbstractController;/ /……TaskController扩展AbstractController{公共函数():响应{/ /……美元形式=美元- >createForm (TaskType::类,美元任务,(“行动”= >美元- >generateUrl (“target_route”),“方法”= >“得到”]);/ /……}}

最后,您可以覆盖行动和方法通过他们的模板形式()或者是form_start ()辅助功能:

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

请注意

如果表单的方法不是得到帖子,但,补丁删除,Sob娱乐下载ymfony会插入一个隐藏字段的名称_method存储这个方法。在正常的表单将提交帖子要求,但ob娱乐下载Symfony的路由能够检测_method并将它作为参数,补丁删除请求。的框架配置引用(FrameworkBundle)这个工作必须启用选项。

改变表单名称

如果你检查的HTML内容呈现形式,你会看到的<形式>名和字段名是类名(如产生的类型。<表单名称= "任务"…><选择name = "任务[dueDate][日期](月)"…>)。

如果你想修改这个,使用createNamed ()方法:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / src /控制器/ TaskController.php名称空间应用程序\控制器;使用应用程序\形式\TaskType;使用ob娱乐下载\\FrameworkBundle\控制器\AbstractController;/ /……TaskController扩展AbstractController{公共函数():响应{美元任务=……;美元形式=美元- >get (“form.factory”)- >createNamed (“my_name”,TaskType::类,美元任务);/ /……}}

你甚至可以抑制这个名字完全通过设置一个空字符串。

HTML验证客户端

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

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

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

表单类型猜测

如果对象由表单包含验证约束,Symfony内省,元数据能猜出你的领域的类型和设置它。ob娱乐下载在上面的例子中,Symfony的验证规则可以ob娱乐下载猜到了任务字段是一个正常的TextType场和dueDate字段是一个DateType字段。

当建筑形式,省略第二个参数add ()方法,或通过,使Symfony的“猜机制”:ob娱乐下载

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/ / src /形式/类型/ TaskType.php名称空间应用程序\形式\类型;使用ob娱乐下载\组件\形式\AbstractType;使用ob娱乐下载\组件\形式\扩展\核心\类型\DateType;使用ob娱乐下载\组件\形式\扩展\核心\类型\SubmitType;使用ob娱乐下载\组件\形式\扩展\核心\类型\TextType;使用ob娱乐下载\组件\形式\FormBuilderInterface;TaskType扩展AbstractType{公共函数buildForm(FormBuilderInterface美元构建器数组,美元选项):无效{美元构建器/ /如果你不定义字段选项,您可以省略第二个参数- >add (“任务”)/ /如果您定义字段选择,传递NULL作为第二个参数- >add (“dueDate”,,(“要求”= >])- >add (“保存”,SubmitType::类);}}

谨慎

当使用一个特定的表单验证组字段类型,推测者仍然会考虑所有验证约束当猜测你的字段类型(包括验证组的约束不属于被使用)。

表单类型选项猜

当启用猜测机制对于一些字段(即您省略或通过作为第二个参数add ()),除了它的形式类型,以下选项也可以猜测:

要求
要求选项可以猜测基于验证规则(即是NotBlankNotNull)或教义的元数据(即可以为空)。这是非常有用的,因为你的客户端验证将自动匹配您的验证规则。
最大长度
如果字段是某种形式的文本字段,然后最大长度选择属性验证约束(如果可以猜到了长度范围)或使用的吗学说(通过元数据字段的长度)。

如果你想改变一个的猜测值,覆盖它通过选项选项字段数组:

1
- >add (“任务”,,(“attr”= > [最大长度的= >4]])

另请参阅

除了猜测表单类型,Symfony还猜测ob娱乐下载验证约束如果你使用一个教条的实体。读数据库和教义ORM指导的更多信息。

地图上未标明的字段

在编辑一个对象通过一种形式,所有表单字段可以被认为是对象的属性。表单上的任何字段不存在的对象会导致抛出一个异常。

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/ /……使用ob娱乐下载\组件\形式\FormBuilderInterface;TaskType扩展AbstractType{公共函数buildForm(FormBuilderInterface美元构建器数组,美元选项):无效{美元构建器- >add (“任务”)- >add (“dueDate”)- >add (“agreeTerms”,CheckboxType::类,“映射”= >])- >add (“保存”,SubmitType::类);}}

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

1 2
美元形式- >get (“agreeTerms”)- >getData ();美元形式- >get (“agreeTerms”)- >setData (真正的);

另外,如果有任何字段的形式不包括在提交数据,将显式地设置这些字段

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。