形式
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 3.0,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
形式
表单是最常被误用的Symfony组件之一,因为它具有广泛的范围和无穷ob娱乐下载无尽的特性列表。在本章中,我们将向您展示一些最佳实践,以便您可以利用表单,但可以快速完成工作。
建筑形式
最佳实践
将表单定义为PHP类。
Form组件允许您在控制器代码中构建表单。如果您不需要在其他地方重用表单,那么这是完全没问题的。但是为了组织和重用,我们建议你在自己的PHP类中定义每个表单:
12 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
名称空间AppBundle\形式;使用ob娱乐下载\组件\形式\AbstractType;使用ob娱乐下载\组件\形式\FormBuilderInterface;使用ob娱乐下载\组件\OptionsResolver\OptionsResolver;使用ob娱乐下载\组件\形式\扩展\核心\类型\TextareaType;使用ob娱乐下载\组件\形式\扩展\核心\类型\EmailType;使用ob娱乐下载\组件\形式\扩展\核心\类型\DateTimeType;类PostType扩展AbstractType{公共函数buildForm(FormBuilderInterface$构建器数组,$选项){$构建器->add (“标题”)->add (“摘要”, TextareaType::类)->add (“内容”, TextareaType::类)->add (“authorEmail”, EmailType::类)->add (“publishedAt”, DateTimeType::类);}公共函数configureOptions(OptionsResolver$解析器){$解析器->setDefaults (数组(“data_class”= >“AppBundle \实体\职位”));}}
最佳实践
类型中的表单类型类AppBundle \形式
命名空间,除非使用其他自定义表单类,如数据转换器。
要使用类,请使用createForm ()
并传递全限定类名:
1 2 3 4 5 6 7 8 9 10 11
/ /……使用AppBundle\形式\PostType;/ /……公共函数newAction(请求$请求){$帖子=新Post ();$形式=$这->createForm (PostType::类,$帖子);/ /……}
登记表格为服务
你也可以将您的表单类型注册为服务.只有当您的表单类型需要容器注入一些依赖项时才需要这样做,否则会造成不必要的开销,因此<新兴市场>不建议对所有表单类型类都这样做。
表单按钮配置
表单类应该尽量不可知<新兴市场>在哪里它们将被使用。这使得以后更容易重用它们。
最佳实践
在模板中添加按钮,而不是在表单类或控制器中添加按钮。
Symfob娱乐下载ony Form组件允许您将按钮作为字段添加到表单上。这是简化呈现表单的模板的好方法。但是如果你直接在你的表单类中添加按钮,这将有效地限制该表单的范围:
12 3 4 5 6 7 8 9 10 11 12
类PostType扩展AbstractType{公共函数buildForm(FormBuilderInterface$构建器数组,$选项){$构建器/ /……->add (“保存”, SubmitType::类,数组(“标签”= >“创建发布”));}/ /……}
这种形式<新兴市场>五月已经设计用于创建帖子,但如果你想重用它来编辑帖子,按钮标签将是错误的。相反,一些开发人员在控制器中配置表单按钮:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
名称空间AppBundle\控制器\管理;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\包\FrameworkBundle\控制器\控制器;使用ob娱乐下载\组件\形式\扩展\核心\类型\SubmitType;使用AppBundle\实体\帖子;使用AppBundle\形式\PostType;类为PostController扩展控制器{/ /……公共函数newAction(请求$请求){$帖子=新Post ();$形式=$这->createForm (PostType::类,$帖子);$形式->add (“提交”, SubmitType::类,数组(“标签”= >“创建”,“attr”= >数组(“类”= >'btn btn-default右拉')));/ /……}}
这也是一个重要的错误,因为您将表示标记(标签、CSS类等)与纯PHP代码混合在一起。关注点分离一直是一个很好的实践,所以把所有与视图相关的东西放在视图层:
1 2 3 4 5 6
{{form_start(form)}}{{form_widget(form)}}<输入类型=“提交”价值=“创造”类=“btn btn-default右拉”/>{{form_end(form)}}
渲染表单
呈现表单的方法有很多,从在一行中呈现整个表单到单独呈现每个字段的每个部分。最好的方法取决于你需要多少定制。
最简单的方法之一(在开发过程中特别有用)是呈现表单标记并使用form_widget ()
函数渲染所有字段:
1 2 3
{{form_start(形式,{attr”:{‘类’:‘my-form-class}})}}{{form_widget(form)}}{{form_end(form)}}
如果需要更多地控制字段的呈现方式,则应该删除form_widget(形式)
函数和单独呈现您的字段。看到如何自定义表单渲染有关这方面的更多信息以及如何控制<新兴市场>如何使用表单主题在全局级别呈现表单。
处理表格提交
处理表单提交通常遵循类似的模板:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
公共函数newAction(请求$请求){//创建表单…$形式->handleRequest ($请求);如果($形式->isSubmitted () & &$形式->isValid ()) {$新兴市场=$这->getDoctrine ()->getManager ();$新兴市场->persist ($帖子);$新兴市场->冲洗();返回$这->重定向($这->generateUrl (“admin_post_show”,数组(“id”= >$帖子->getId ())));}//渲染模板}
这里只有两件值得注意的事情。首先,我们建议您同时使用一个操作来呈现表单和处理表单提交。例如,你<新兴市场>可以有一个newAction ()
那<新兴市场>只有显示窗体和createAction ()
那<新兴市场>只有处理表单提交。这两种行为几乎是相同的。所以让它更简单newAction ()
处理一切。
第二,我们推荐使用形式- > isSubmitted ()
在如果
声明清楚。这在技术上并不需要,因为isValid ()
第一次调用isSubmitted ()
.但如果没有这一点,流程就不能很好地阅读<新兴市场>看起来就像表格一样<新兴市场>总是处理(即使在GET请求上)。