表单组件

编辑该页面

警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 2.8,不再维护。

这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。

表单组件

表单组件允许您轻松地创建、处理和重用形式。

表单组件是一个工具来帮助您解决问题,允许终端用户与应用程序的数据和修改数据。尽管传统上这是通过HTML表单组件集中处理数据从客户端和应用程序,这些数据是否被从一个正常的形式或从一个API。

安装

1
美元作曲家需要symfony /形式欧宝娱乐app下载地址

或者,您可以克隆的https://github.com/欧宝娱乐app下载地址symfony/form存储库。

请注意

如果你安装这个组件之外的Symfony应用程序,你必须要求欧宝娱乐app下载地址供应商/ autoload.php文件在你的代码,使作曲家提供的类加载机制。读这篇文章为更多的细节。

配置

另请参阅

这篇文章解释了如何使用表单功能作为一个独立的组件在任何PHP应用程序。读了形式文章在Symfony应用程序了解如何使用它。欧宝娱乐app下载地址

在Sy欧宝娱乐app下载地址mfony中,形式为对象,这些对象通过使用形式的工厂。建立一种工厂很简单:

1 2 3
使用欧宝娱乐app下载地址\组件\形式\形式;美元formFactory=形式::createFormFactory ();

这个工厂已经可以用于创建基本形式,但它缺乏支持非常重要的特点:

  • 请求处理:支持请求处理和文件上传;
  • CSRF保护:支持保护跨站请求伪造(CSRF)攻击;
  • 模板:与模板的集成层,允许重用HTML片段在呈现一种形式;
  • 翻译:支持翻译错误消息,字段标签和其他字符串;
  • 验证:集成验证库为提交的数据生成错误消息。

Symf欧宝娱乐app下载地址ony的表单组件依赖于其他库来解决这些问题。大部分的时间你会用树枝和Symfony欧宝娱乐app下载地址HttpFoundation、翻译和验证器组件,但是你可以取代这些不同图书馆的你的选择。

下面的小节解释如何将这些库插入到工厂。

提示

一个工作示例,请参阅https://github.com/webmozart/standalone-forms

请求处理

2.3

handleRequest ()方法是在Symfony 2.3中引入的。欧宝娱乐app下载地址

处理表单数据,您将需要调用handleRequest ()方法:

1
美元形式- >handleRequest ();

在幕后,这使用了NativeRequestHandler对象读取数据的正确的PHP已经(即。$ _POST$ _GET基于表单上的HTTP方法配置(默认)。

另请参阅

如果你需要更多的控制什么时候提交表单或数据传递给它,您可以使用提交()对于这个。阅读更多关于它如何使用submit()函数来处理表单提交

如果你使用HttpFoundation组件,那么你应该添加HttpFoundationExtension你的工厂形式:

1 2 3 4 5 6
使用欧宝娱乐app下载地址\组件\形式\形式;使用欧宝娱乐app下载地址\组件\形式\扩展\HttpFoundation\HttpFoundationExtension;美元formFactory=形式::createFormFactoryBuilder ()- >addExtension (HttpFoundationExtension ())- >getFormFactory ();

现在,当你处理一个表单,您可以通过请求对象handleRequest ():

1
美元形式- >handleRequest (美元请求);

请注意

为更多的信息关于HttpFoundation组件或如何安装它,明白了HttpFoundation组件

CSRF保护

抵御CSRF攻击是表单组件,但是你需要显式地启用它或把它换成一个定制的解决方案。如果你想使用内置的支持,首先安装安全CSRF组件:

1
美元作曲家需要symfony / se欧宝娱乐app下载地址curity-csrf

以下代码片段添加CSRF保护形式工厂:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
使用欧宝娱乐app下载地址\组件\形式\形式;使用欧宝娱乐app下载地址\组件\HttpFoundation\会话\会话;使用欧宝娱乐app下载地址\组件\形式\扩展\Csrf\CsrfExtension;使用欧宝娱乐app下载地址\组件\安全\Csrf\TokenStorage\SessionTokenStorage;使用欧宝娱乐app下载地址\组件\安全\Csrf\TokenGenerator\UriSafeTokenGenerator;使用欧宝娱乐app下载地址\组件\安全\Csrf\CsrfTokenManager;/ /创建一个会话对象从HttpFoundation组件美元会话=会话();美元csrfGenerator=UriSafeTokenGenerator ();美元csrfStorage=SessionTokenStorage (美元会话);美元csrfManager=CsrfTokenManager (美元csrfGenerator,美元csrfStorage);美元formFactory=形式::createFormFactoryBuilder ()/ /……- >addExtension (CsrfExtension (美元csrfManager))- >getFormFactory ();

在内部,该扩展将自动隐藏字段添加到每个表单(称为_token默认情况下),其价值是由CSRF生成器自动生成和验证当绑定表单。

提示

如果你不使用HttpFoundation组件,您可以使用NativeSessionTokenStorage相反,它依赖于PHP的原生会话处理:

1 2 3 4
使用欧宝娱乐app下载地址\组件\安全\Csrf\TokenStorage\NativeSessionTokenStorage;美元csrfStorage=NativeSessionTokenStorage ();/ /……

你可以禁用每个表单使用CSRF保护csrf_protection选择:

1 2 3 4
使用欧宝娱乐app下载地址\ \组件\ \形式\ \扩展\ \核心\ \类型\ \FormType美元形式= $formFactory- >createBuilder(FormType::,,['csrf_protection' = >)- >getForm();

树枝模板

如果你使用表单组件处理HTML表单,你会很容易需要一种方法来呈现表单作为HTML表单字段(字段值,错误,和标签)。如果你使用嫩枝当你的模板引擎,表单组件提供了一个丰富的集成。

使用集成,你需要树枝大桥,树枝和一些Symfony之间提供集成组件:欧宝娱乐app下载地址

1
美元作曲家需要symfony / tw欧宝娱乐app下载地址ig-bridge

TwigBridge集成提供了几个树枝的功能帮助你呈现HTML小部件,标签和错误每个字段(以及一些其他的事情)。配置集成,你需要引导或访问树枝和添加FormExtension:

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 35 36 37
使用欧宝娱乐app下载地址\组件\形式\形式;使用欧宝娱乐app下载地址\\嫩枝\扩展\FormExtension;使用欧宝娱乐app下载地址\\嫩枝\形式\TwigRenderer;使用欧宝娱乐app下载地址\\嫩枝\形式\TwigRendererEngine;使用嫩枝\环境;使用嫩枝\加载程序\FilesystemLoader;/ /持有所有的树枝文件的默认标记呈现形式/ /这个文件TwigBridge美元defaultFormTheme=“form_div_layout.html.twig”;美元vendorDirectory= realpath (__DIR__“/ . . /供应商”);/ /路径TwigBridge图书馆所以树枝可以定位/ / form_div_layout.html。树枝文件美元appVariableReflection=\ ReflectionClass (“桥欧宝娱乐app下载地址\ Symfony \ \树枝\ AppVariable”);美元vendorTwigBridgeDirectory=目录名(美元appVariableReflection- >getFileName ());/ /你的其他模板的路径美元viewsDirectory= realpath (__DIR__“/ . . /视图”);美元嫩枝=环境(FilesystemLoader (数组(美元viewsDirectory,美元vendorTwigBridgeDirectory“/资源/视图/形式”)));美元formEngine=TwigRendererEngine (数组(美元defaultFormTheme));美元formEngine- >setEnvironment (美元嫩枝);/ /……(有关更多信息,请参见前面的CSRF保护部分)/ /添加FormExtension树枝美元嫩枝- >addExtension (FormExtension (TwigRenderer (美元formEngine,美元csrfManager)));/ /创建一个工厂美元formFactory=形式::createFormFactoryBuilder ()/ /……- >getFormFactory ();

你的具体细节树枝配置会有所不同,但目标是总是添加吗FormExtension嫩枝,可以让你接触树枝函数呈现形式。要做到这一点,首先需要创建一个TwigRendererEngine,你定义你形式的主题(即资源/文件定义HTML标记)。

对于一般的细节呈现形式,明白了如何自定义形式呈现

请注意

如果你使用树枝集成,读作“表单组件“下面的细节需要翻译过滤器。

翻译

如果你用树枝融入主题文件默认表单(如之一。form_div_layout.html.twig),有两个树枝过滤器(反式transChoice)标签,用于翻译形式错误,选择文本和其他字符串。

添加这些树枝过滤器,您可以使用内置的TranslationExtensionSymfony的翻译集成组件,或添加2枝过欧宝娱乐app下载地址滤器自己,通过自己的树枝扩展。

使用内置的集成,确保您的项目已Symfony的翻译欧宝娱乐app下载地址配置组件安装:

1
美元作曲家翻译需要symfony / 欧宝娱乐app下载地址symfony /配置

接下来,添加TranslationExtension到你的树枝\ \环境实例:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
使用欧宝娱乐app下载地址\组件\形式\形式;使用欧宝娱乐app下载地址\组件\翻译\翻译;使用欧宝娱乐app下载地址\组件\翻译\加载程序\XliffFileLoader;使用欧宝娱乐app下载地址\\嫩枝\扩展\TranslationExtension;/ /创建翻译美元翻译=翻译(“en”);/ /加载一些翻译美元翻译- >addLoader (“xlf”,XliffFileLoader ());美元翻译- >addResource (“xlf”,__DIR__“/道路/ /翻译/ messages.en.xlf”,“en”);/ /添加TranslationExtension(给我们反式和transChoice过滤器)美元嫩枝- >addExtension (TranslationExtension (美元翻译));美元formFactory=形式::createFormFactoryBuilder ()/ /……- >getFormFactory ();

根据您的翻译正在加载,您现在可以添加字符串键,如字段标签和他们的翻译给你翻译文件。

翻译的更多细节,请参阅翻译

验证

表单组件带有紧(但可选)与Symfony的验证器组件的集成。欧宝娱乐app下载地址如果您正在使用一个不同的解决方案验证,没有问题!简单的表单的提交/绑定数据(这是一个数组或对象)和通过自己的验证系统。

使用Symfony的验证器组件的集成,首先确保它是安装在欧宝娱乐app下载地址您的应用程序:

1
美元作曲家需要symfony /验证器欧宝娱乐app下载地址

如果你不熟悉Symfony的验证器组件,阅读更多关于它:欧宝娱乐app下载地址验证。有一个表单组件ValidatorExtension类,它自动验证适用于您的数据绑定。这些错误然后映射到正确的领域和呈现。

集成与验证组件将会看起来像这样:

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
使用欧宝娱乐app下载地址\组件\形式\形式;使用欧宝娱乐app下载地址\组件\形式\扩展\验证器\ValidatorExtension;使用欧宝娱乐app下载地址\组件\验证器\验证;美元vendorDirectory= realpath (__DIR__“/ . . /供应商”);美元vendorFormDirectory=美元vendorDirectory“/欧宝娱乐app下载地址 symfony /形式”;美元vendorValidatorDirectory=美元vendorDirectory“/欧宝娱乐app下载地址 symfony /验证器”;/ /创建一个验证器,细节会有所不同美元验证器=验证::createValidator ();/ /核心有内置翻译错误消息美元翻译- >addResource (“xlf”,美元vendorFormDirectory' /资源/翻译/ validators.en.xlf ',“en”,“验证”);美元翻译- >addResource (“xlf”,美元vendorValidatorDirectory' /资源/翻译/ validators.en.xlf ',“en”,“验证”);美元formFactory=形式::createFormFactoryBuilder ()/ /……- >addExtension (ValidatorExtension (美元验证器))- >getFormFactory ();

为了了解更多,跳过了表单组件部分。

访问表单工厂

应用程序只需要一种形式的工厂,一个工厂对象应该用于在应用程序中创建所有表单对象。这意味着您应该创建一些中央,引导您的应用程序,然后访问它的一部分,每当你需要建立一个形式。

请注意

在本文档中,表单工厂总是一个局部变量formFactory美元。需要指出的是,您可能需要创建这个对象在一些更“全球”的方式,这样你就可以从任何地方访问它。

你是如何获得你的厂是一种形式。如果您正在使用一个服务容器(如提供的DependencyInjection组件),那么您应该将工厂的形式添加到您的容器,当你需要抓住它。如果您的应用程序使用全局或静态变量(通常不是一个好主意),那么您可以将对象存储在一些静态类或做类似的事情。

不管你如何应用程序架构师,只要记住,你应该只有一个工厂和形式,您需要在您的应用程序能够访问它。

创建一个简单的形式

提示

如果你使用Symfony框架,然后工厂形欧宝娱乐app下载地址式可用自动作为服务调用form.factory。同时,控制器类都有一个默认的基地createFormBuilder ()方法,该方法是一种捷径获取工厂和电话createBuilder ()在上面。

创建一个表单是通过一个FormBuilder对象,构建和配置不同的领域。表单生成器创建的工厂。

  • 独立使用
  • 框架的使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
使用欧宝娱乐app下载地址\组件\形式\扩展\核心\类型\TextType;使用欧宝娱乐app下载地址\组件\形式\扩展\核心\类型\DateType;/ /……美元形式=美元formFactory- >createBuilder ()- >add (“任务”,TextType::类)/ /如果使用PHP 5.3或5.4,您必须使用/ / - >添加(‘任务’,‘Sy欧宝娱乐app下载地址mfony组件\ \ \ \ \核心类型的扩展形式\ TextType”)- >add (“dueDate”,DateType::类)- >getForm ();var_dump (美元嫩枝- >呈现(“new.html.twig”,数组(“形式”= >美元形式- >createView ())));

正如你所看到的,创建一个形式就像写食谱:你的呼唤add ()为每一个您想要创建的新领域。第一个参数为add ()字段的名称,第二个是完全限定的类名。如果您使用PHP 5.5或更高版本,您可以使用::类常数的一种类型。组件有很多形式内置类型

现在您已经建立表单,学习如何渲染它,处理表单提交

设置默认值

如果你需要表单加载一些默认值(或者你正在构建一个“编辑”形式),仅仅通过在默认数据创建表单生成器时:

  • 独立使用
  • 框架的使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14
使用欧宝娱乐app下载地址\组件\形式\扩展\核心\类型\FormType;使用欧宝娱乐app下载地址\组件\形式\扩展\核心\类型\TextType;使用欧宝娱乐app下载地址\组件\形式\扩展\核心\类型\DateType;/ /……美元违约=数组(“dueDate”= >\ DateTime (“明天”),);美元形式=美元formFactory- >createBuilder (FormType::类,美元违约)- >add (“任务”,TextType::类)- >add (“dueDate”,DateType::类)- >getForm ();

提示

在这个例子中,默认的数据是一个数组。之后,当你使用data_class选项来将数据直接绑定到对象,默认数据将该对象的一个实例。

呈现形式

既然已经创建了表单,下一步是呈现它。这样做是通过一种特殊的“视图”模板(注意对象$形式- > createView ()在上面的控制器),使用一组表单辅助函数:

1 2 3 4 5
{{form_start(形式)}}{{form_widget(形式)}}<输入类型=“提交”/ >{{form_end(形式)}}

就是这样!通过印刷form_widget(形式)每个字段的形式呈现,以及一个标签和错误消息(如果有的话)。像这是那么容易,不是非常灵活的(还)。通常情况下,你要单独渲染每个表单字段,这样你就可以控制形式的样子。你将学习如何在“如何控制呈现的一种形式吗”一节。

改变窗体的方法和行动

2.3

配置形式方法的能力和行动是在Symfony 2.3中引入的。欧宝娱乐app下载地址

默认情况下,表单提交相同的URI的形式呈现一个HTTP POST请求。这种行为可以改变使用FormType领域FormType领域选项(方法选项也使用handleRequest ()确定是否在表单被提交):

  • 独立使用
  • 框架的使用
1 2 3 4 5 6 7 8 9 10
使用欧宝娱乐app下载地址\组件\形式\扩展\核心\类型\FormType;/ /……美元formBuilder=美元formFactory- >createBuilder (FormType::类,,数组(“行动”= >“/搜索”,“方法”= >“得到”));/ /……

处理表单提交

处理表单提交,可以使用handleRequest ()方法:

  • 独立使用
  • 框架的使用
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
使用欧宝娱乐app下载地址\组件\HttpFoundation\请求;使用欧宝娱乐app下载地址\组件\HttpFoundation\RedirectResponse;使用欧宝娱乐app下载地址\组件\形式\扩展\核心\类型\DateType;使用欧宝娱乐app下载地址\组件\形式\扩展\核心\类型\TextType;/ /……美元形式=美元formFactory- >createBuilder ()- >add (“任务”,TextType::类)- >add (“dueDate”,DateType::类)- >getForm ();美元请求=请求::createFromGlobals ();美元形式- >handleRequest (美元请求);如果(美元形式- >isSubmitted () & &美元形式- >isValid ()) {美元数据=美元形式- >getData ();/ /……执行一些操作,例如将数据保存到数据库中美元响应=RedirectResponse (“成功/任务/”);美元响应- >准备(美元请求);返回美元响应- >send ();}/ /……

这定义了一个常见“工作流”,它包含三种不同的可能性:

  1. 在最初的GET请求(例如,当用户“冲浪”页面),构建形式和呈现;

如果请求是一个岗位,过程(通过提交的数据handleRequest ())。然后:

  1. 如果表单无效,重新呈现形式(现在将包含错误);
  2. 如果表单有效,执行一些动作和重定向。

幸运的是,你不需要决定是否提交了一种形式。将当前请求传递给handleRequest ()方法。然后,表单组件将为你做所有必要的工作。

表单验证

最简单的方式向表单添加验证通过约束选择在构建每个字段:

  • 独立使用
  • 框架的使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
使用欧宝娱乐app下载地址\组件\验证器\约束\NotBlank;使用欧宝娱乐app下载地址\组件\验证器\约束\类型;使用欧宝娱乐app下载地址\组件\形式\扩展\核心\类型\TextType;使用欧宝娱乐app下载地址\组件\形式\扩展\核心\类型\DateType;美元形式=美元formFactory- >createBuilder ()- >add (“任务”,TextType::类,数组(“约束”= >NotBlank ()))- >add (“dueDate”,DateType::类,数组(“约束”= >数组(NotBlank (),(\ DateTime类型::类))))- >getForm ();

当表单绑定,这些验证约束将自动应用和旁边的错误会显示字段错误。

请注意

所有的内置的验证约束,明白了验证约束参考

访问形式错误

您可以使用getErrors ()错误的方法来访问列表。它返回一个FormErrorIterator实例:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
美元形式=……;/ /……/ / FormErrorIterator实例,但只有附加到这个错误/ /表单水平(如全局错误)美元错误=美元形式- >getErrors ();/ / FormErrorIterator实例,但只有附加到错误/ /“firstName”字段美元错误=美元形式(“firstName”]- >getErrors ();/ / FormErrorIterator实例在一个扁平结构/ /使用getOrigin()来确定导致错误的形式美元错误=美元形式- >getErrors (真正的);/ / FormErrorIterator实例树结构表示形式美元错误=美元形式- >getErrors (真正的,);

提示

在年长的Symfo欧宝娱乐app下载地址ny的版本中,getErrors ()返回一个数组。使用同样的错误在Symfony 2.5或更新版本,你必须通过PHP的欧宝娱乐app下载地址iterator_to_array功能:

1
美元errorsAsArray= iterator_to_array (美元形式- >getErrors ());

这是有用的,例如,如果您想要使用PHP的array_ * ()函数形式错误。

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