表单组件

编辑该页面

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

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

表单组件

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

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

安装

您可以安装组件在两个不同的方面:

配置

提示

如果你正在与完整Symfony框架,已经为你配置表单组件。欧宝娱乐app下载地址在这种情况下,跳过表单组件

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

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

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

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

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

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

提示

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

请求处理

2.3

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

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

1
美元形式- >handleRequest ();

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

如果你使用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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
使用欧宝娱乐app下载地址\组件\形式\形式;使用欧宝娱乐app下载地址\组件\形式\扩展\Csrf\CsrfExtension;使用欧宝娱乐app下载地址\组件\形式\扩展\Csrf\CsrfProvider\SessionCsrfProvider;使用欧宝娱乐app下载地址\组件\HttpFoundation\会话\会话;/ /生成一个CSRF的秘密美元csrfSecret=“<生成令牌>”;/ /创建一个会话对象从HttpFoundation组件美元会话=会话();美元csrfProvider=SessionCsrfProvider (美元会话,美元csrfSecret);美元formFactory=形式::createFormFactoryBuilder ()/ /……- >addExtension (CsrfExtension (美元csrfProvider))- >getFormFactory ();

对CSRF攻击安全的应用程序,您需要定义一个CSRF的秘密。生成一个随机字符串至少有32个字符,在上面的代码片段插入并确保除了您的web服务器可以访问这个秘密。

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

提示

如果你不使用HttpFoundation组件、负载使用DefaultCsrfProvider相反,它依赖于PHP的原生会话处理:

1 2 3
使用欧宝娱乐app下载地址\组件\形式\扩展\Csrf\CsrfProvider\DefaultCsrfProvider;美元csrfProvider=DefaultCsrfProvider (美元csrfSecret);

树枝模板

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

使用集成、你需要的TwigBridge,它提供了树枝和一些Symfony组件之间的集成。欧宝娱乐app下载地址如果您使用的是作曲家,你可以通过添加以下安装最新的2.3版本需要线给你composer.json文件:

1 2 3 4 5
{“需要”:{“欧宝娱乐app下载地址symfony / twig-bridge”:2.3“。*”}}

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
使用欧宝娱乐app下载地址\组件\形式\形式;使用欧宝娱乐app下载地址\\嫩枝\扩展\FormExtension;使用欧宝娱乐app下载地址\\嫩枝\形式\TwigRenderer;使用欧宝娱乐app下载地址\\嫩枝\形式\TwigRendererEngine;/ /持有所有的树枝文件的默认标记呈现形式/ /这个文件TwigBridge美元defaultFormTheme=“form_div_layout.html.twig”;美元vendorDir= realpath (__DIR__“/ . . /供应商”);/ /路径TwigBridge所以树枝可以定位/ / form_div_layout.html。树枝文件美元vendorTwigBridgeDir=美元vendorDir' 欧宝娱乐app下载地址/ symfony / twig-bridge / symfony /桥/枝’;/ /你的其他模板的路径美元viewsDir= realpath (__DIR__“/ . . /视图”);美元嫩枝=Twig_Environment (Twig_Loader_Filesystem (数组(美元viewsDir,美元vendorTwigBridgeDir“/资源/视图/形式”)));美元formEngine=TwigRendererEngine (数组(美元defaultFormTheme));美元formEngine- >setEnvironment (美元嫩枝);/ /添加FormExtension树枝美元嫩枝- >addExtension (FormExtension (TwigRenderer (美元formEngine,美元csrfProvider)));/ /创建表单正常工厂美元formFactory=形式::createFormFactoryBuilder ()/ /……- >getFormFactory ();

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

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

请注意

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

翻译

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

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

使用内置的集成,确保您的项目已Symfony的翻译欧宝娱乐app下载地址配置组件安装。如果您使用的是作曲家,你可以获得最新的2.3版本的每一个通过添加以下给你composer.json文件:

1 2 3 4 5 6
{“需要”:{“欧宝娱乐app下载地址symfony /翻译”:2.3“。*”,“欧宝娱乐app下载地址symfony /配置”:2.3“。*”}}

接下来,添加TranslationExtension到你的Twig_Environment实例:

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下载地址您的应用程序。如果您使用的是作曲家和想要安装最新的2.3版本,添加你composer.json:

1 2 3 4 5
{“需要”:{“欧宝娱乐app下载地址symfony /验证器”:2.3“。*”}}

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

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

访问表单工厂

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

请注意

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

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

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

创建一个简单的形式

提示

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

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

  • 独立使用
  • 框架的使用
1 2 3 4 5 6 7 8
美元形式=美元formFactory- >createBuilder ()- >add (“任务”,“文本”)- >add (“dueDate”,“日期”)- >getForm ();回声美元嫩枝- >呈现(“new.html.twig”,数组(“形式”= >美元形式- >createView ()));

正如你所看到的,创建一个形式就像写食谱:你的呼唤添加为每一个您想要创建的新领域。第一个参数为添加字段的名称,第二个是“类型”字段。组件有很多形式内置类型

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

设置默认值

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

  • 独立使用
  • 框架的使用
1 2 3 4 5 6 7 8
美元违约=数组(“dueDate”= >\ DateTime (“明天”),);美元形式=美元formFactory- >createBuilder (“形式”,美元违约)- >add (“任务”,“文本”)- >add (“dueDate”,“日期”)- >getForm ();

提示

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

呈现形式

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

1 2 3 4 5
<形式行动=“#”方法=“职位”{{form_enctype(形式)}}>{{form_widget(形式)}}<输入类型=“提交”/ >< /形式>

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

处理表单提交

处理表单提交,可以使用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
使用欧宝娱乐app下载地址\组件\HttpFoundation\请求;使用欧宝娱乐app下载地址\组件\HttpFoundation\RedirectResponse;美元形式=美元formFactory- >createBuilder ()- >add (“任务”,“文本”)- >add (“dueDate”,“日期”)- >getForm ();美元请求=请求::createFromGlobals ();美元形式- >handleRequest (美元请求);如果(美元形式- >isValid ()) {美元数据=美元形式- >getData ();/ /……执行一些操作,例如将数据保存到数据库中美元响应=RedirectResponse (“成功/任务/”);美元响应- >准备(美元请求);返回美元响应- >send ();}/ /……

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

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

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

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

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

表单验证

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

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

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

请注意

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

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