形式
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.5,现已不再维护。
读本页的更新版本用于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 30 31
名称空间AppBundle\形式;使用ob娱乐下载\组件\形式\AbstractType;使用ob娱乐下载\组件\形式\FormBuilderInterface;使用ob娱乐下载\组件\OptionsResolver\OptionsResolverInterface;类PostType扩展AbstractType{公共函数buildForm(FormBuilderInterface$构建器数组,$选项){$构建器->add (“标题”)->add (“摘要”,“文本区域”)->add (“内容”,“文本区域”)->add (“authorEmail”,“电子邮件”)->add (“publishedAt”,“datetime”);}公共函数setDefaultOptions(OptionsResolverInterface$解析器){$解析器->setDefaults (数组(“data_class”= >“AppBundle \实体\职位”));}公共函数getName(){返回“职位”;}}
要使用类,请使用createForm
并实例化新类:
1 2 3 4 5 6 7 8 9 10
使用AppBundle\形式\PostType;/ /……公共函数newAction(请求$请求){$帖子=新Post ();$形式=$这->createForm (新PostType (),$帖子);/ /……}
登记表格为服务
你也可以将您的表单类型注册为服务.但是这是<新兴市场>不方法将新表单类型直接嵌入到其他表单中或通过集合类型.
对于大多数只用于编辑或创建内容的表单来说,将表单注册为服务是多余的,并且使得更难确定控制器中使用的是哪个表单类。
表单按钮配置
表单类应该尽量不可知<新兴市场>在哪里它们将被使用。这使得以后更容易重用它们。
最佳实践
在模板中添加按钮,而不是在表单类或控制器中添加按钮。
从Symfoob娱乐下载ny 2.5开始,您可以将按钮作为字段添加到表单中。这是简化呈现表单的模板的好方法。但是如果你直接在你的表单类中添加按钮,这将有效地限制该表单的范围:
12 3 4 5 6 7 8 9 10 11 12
类PostType扩展AbstractType{公共函数buildForm(FormBuilderInterface$构建器数组,$选项){$构建器/ /……->add (“保存”,“提交”,数组(“标签”= >“创建发布”));}/ /……}
这种形式<新兴市场>五月已经设计用于创建帖子,但如果你想重用它来编辑帖子,按钮标签将是错误的。相反,一些开发人员在控制器中配置表单按钮:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
名称空间AppBundle\控制器\管理;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\包\FrameworkBundle\控制器\控制器;使用AppBundle\实体\帖子;使用AppBundle\形式\PostType;类为PostController扩展控制器{/ /……公共函数newAction(请求$请求){$帖子=新Post ();$形式=$这->createForm (新PostType (),$帖子);$形式->add (“提交”,“提交”,数组(“标签”= >“创建”,“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请求上)。