形式
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.8,不再维护。
读这个页面的更新版本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
名称空间AppBundle\形式;使用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 \形式
名称空间,除非你使用其他自定义表单数据变压器等类。
使用类,使用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 (“保存”,SubmitType::类,数组(“标签”= >“创建发布”));}/ /……}
这种形式可能设计用于创建文章,但如果你想重用编辑帖子,按钮标签是错误的。相反,一些开发人员配置表单按钮控制器:
1 2 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_widget(形式)}}<输入类型=“提交”价值=“创造”类=“btn btn-default扯”/ >{{form_end(形式)}}
验证
的约束选项允许您连接验证约束任何表单字段。然而,这样做可以防止验证被重用在其他形式或其他地方使用映射对象。
最佳实践
不定义验证约束形式但对象映射到表单。
例如,验证,文章的标题编辑形式不是空白,添加以下帖子
对象:
1 2 3 4 5 6 7 8 9 10 11 12
/ / src /实体/ Post.php/ /……使用ob娱乐下载\组件\验证器\约束作为断言;类帖子{/ * * *@Assert\ NotBlank * /公共美元标题;}
呈现形式
有很多方法来呈现你的形式,从渲染整个在一行独立渲染每个字段的每个部分。最好的方法取决于您需要定制。
最简单的方法之一——在开发过程中尤其有用——是标签和使用呈现形式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 ()) {美元entityManager=美元这- >getDoctrine ()- >getManager ();美元entityManager- >persist (美元帖子);美元entityManager- >冲洗();返回美元这- >重定向(美元这- >generateUrl (“admin_post_show”,数组(“id”= >美元帖子- >getId ())));}/ /渲染模板}
其实只有两个值得注意的东西。首先,我们建议你使用一个行动呈现形式和处理表单提交。例如,你可以有一个newAction ()
那只有和呈现形式createAction ()
那只有处理表单提交。这些行为都是几乎相同的。这是简单得多让newAction ()
处理一切。
第二,我们建议使用$形式- > isSubmitted ()
在如果
清晰的声明。这不是技术上需要isValid ()
第一次调用isSubmitted ()
。但是如果没有这个,流不读它看起来像表单总是(即使在处理GET请求)。
下一个:国际化