形式
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.3,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
形式
误用最多的形式是一个Symfony组件由于其庞大的范围和无尽的特性列ob娱乐下载表。在这一章里,我们将向您展示一些最佳实践,这样你就可以利用形式但很快完成工作。
建筑形式
最佳实践
表单定义为PHP类。
表单组件允许您构建控制器内部形成正确的代码。这是非常好,如果你不需要重用在其他地方。但对于组织和重用,我们建议您在自己的PHP类定义每个表单:
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
名称空间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(){返回“职位”;}}
最佳实践
把表单类型的类AppBundle \形式
名称空间,除非你使用其他自定义表单数据变压器等类。
使用类,使用createForm ()
和实例化新类:
1 2 3 4 5 6 7 8 9 10 11
/ /……使用AppBundle\形式\PostType;/ /……公共函数newAction(请求美元请求){美元帖子=新Post ();美元形式=美元这- >createForm (新PostType (),美元帖子);/ /……}
作为服务登记表格
你也可以注册表单类型作为服务。但这是<新兴市场>不建议,除非你打算重用的新形式类型在许多地方或嵌入在直接或通过其他形式集合类型。
仅供使用的大多数形式编辑或创建,注册表单作为服务是过犹不及,使它更加难以找出哪些形式类被用于一个控制器。
表单按钮配置
表单类应该是不可知论者<新兴市场>在哪里他们将被使用。这使得他们更容易重用。
最佳实践
在模板中添加按钮,而不是类或控制器。
因为Symfob娱乐下载ony 2.3,您可以添加按钮字段在表单。这是一个很好的方式来简化呈现表单的模板。但是如果你在形式直接添加的按钮类,这将有效地限制这种形式的范围:
1 2 3 4 5 6 7 8 9 10 11 12
类PostType扩展AbstractType{公共函数buildForm(FormBuilderInterface美元构建器数组,美元选项){美元构建器/ /……- >add (“保存”,“提交”,数组(“标签”= >“创建发布”));}/ /……}
这种形式<新兴市场>可能设计用于创建文章,但如果你想重用编辑帖子,按钮标签是错误的。相反,一些开发人员配置表单按钮控制器:
1 2 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_widget(形式)}}<输入类型=“提交”价值=“创造”类=“btn btn-default扯”/ >{{form_end(形式)}}
呈现形式
有很多方法来呈现你的形式,从渲染整个在一行独立渲染每个字段的每个部分。最好的方法取决于您需要定制。
最简单的方法之一——在开发过程中尤其有用——是标签和使用呈现形式form_widget ()
函数呈现的所有字段:
1 2 3
{{form_start(形式,{attr”:{‘类’:‘my-form-class}})}}{{form_widget(形式)}}{{form_end(形式)}}
如果你需要更多的控制你的字段是如何呈现的,那么您应该删除form_widget(形式)
功能和单独渲染你的领域。看到如何自定义形式呈现食谱文章的更多信息以及如何控制<新兴市场>如何的形式呈现在全球层面使用主题。
处理表单提交
处理表单提交通常遵循一个类似的模板:
1 2 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请求)。
自定义表单字段类型
最佳实践
添加app_
前缀,您的自定义表单字段类型,以避免碰撞。
自定义表单字段类型继承AbstractType
类,它定义了getName ()
方法配置形式类型的名称。这些名称必须是唯一的应用程序中。
如果一个定制的表单类型使用相同的名称作为Symfony的任何内置的形式类型,它将覆盖它。ob娱乐下载同样发生在自定义表单类型匹配任何类型的定义的第三方包安装在您的应用程序。
添加app_
前缀定制表单字段类型,以避免名称冲突,可能导致难以调试错误。