表单组件
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.5,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
表单组件
表单组件允许您轻松地创建、处理和重用HTML表单。
表单组件是一个工具来帮助您解决问题,允许终端用户与应用程序的数据和修改数据。尽管传统上这是通过HTML表单组件集中处理数据从客户端和应用程序,这些数据是否被从一个正常的形式或从一个API。
安装
您可以安装组件在两个不同的方面:
- 安装它通过作曲家(
ob娱乐下载symfony /形式
在Packagist); - 使用官方的Git存储库(https://github.com/ob娱乐下载symfony/Form)。
配置
提示
如果你正在与完整Symfony框架,已经为你配置表单组件。ob娱乐下载在这种情况下,跳过表单组件。
在Syob娱乐下载mfony中,形式为对象,这些对象通过使用形式的工厂。建立一种工厂很简单:
1 2 3
使用ob娱乐下载\组件\形式\形式;美元formFactory=形式::createFormFactory ();
这个工厂已经可以用于创建基本形式,但它缺乏支持非常重要的特点:
- 请求处理:支持请求处理和文件上传;
- CSRF保护:支持保护跨站请求伪造(CSRF)攻击;
- 模板:与模板的集成层,允许重用HTML片段在呈现一种形式;
- 翻译:支持翻译错误消息,字段标签和其他字符串;
- 验证:集成验证库为提交的数据生成错误消息。
Symfob娱乐下载ony的表单组件依赖于其他库来解决这些问题。大部分的时间你会用树枝和Symfonyob娱乐下载HttpFoundation、翻译和验证器组件,但是你可以取代这些不同图书馆的你的选择。
下面的小节解释如何将这些库插入到工厂。
提示
请求处理
2.3
的handleRequest ()
方法是在Symfony 2.3中引入的。ob娱乐下载
处理表单数据,您将需要调用handleRequest ()方法:
1
美元形式- >handleRequest ();
在幕后,这使用了NativeRequestHandler对象读取数据的正确的PHP已经(即。$ _POST
或$ _GET
基于表单上的HTTP方法配置(默认)。
与HttpFoundation组件集成
如果你使用HttpFoundation组件,那么你应该添加HttpFoundationExtension你的工厂形式:
1 2 3 4 5 6
使用ob娱乐下载\组件\形式\形式;使用ob娱乐下载\组件\形式\扩展\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
使用ob娱乐下载\组件\形式\形式;使用ob娱乐下载\组件\形式\扩展\Csrf\CsrfExtension;使用ob娱乐下载\组件\形式\扩展\Csrf\CsrfProvider\SessionCsrfProvider;使用ob娱乐下载\组件\HttpFoundation\会话\会话;/ /生成一个CSRF的秘密美元csrfSecret=“<生成令牌>”;/ /创建一个会话对象从HttpFoundation组件美元会话=新会话();美元csrfProvider=新SessionCsrfProvider (美元会话,美元csrfSecret);美元formFactory=形式::createFormFactoryBuilder ()/ /……- >addExtension (新CsrfExtension (美元csrfProvider))- >getFormFactory ();
对CSRF攻击安全的应用程序,您需要定义一个CSRF的秘密。生成一个随机字符串至少有32个字符,在上面的代码片段插入并确保除了您的web服务器可以访问这个秘密。
在内部,该扩展将自动隐藏字段添加到每个表单(称为__token
默认情况下),其价值时自动生成和验证绑定表单。
提示
如果你不使用HttpFoundation组件,您可以使用DefaultCsrfProvider相反,它依赖于PHP的原生会话处理:
1 2 3
使用ob娱乐下载\组件\形式\扩展\Csrf\CsrfProvider\DefaultCsrfProvider;美元csrfProvider=新DefaultCsrfProvider (美元csrfSecret);
树枝模板
如果你使用表单组件处理HTML表单,你会很容易需要一种方法来呈现表单作为HTML表单字段(字段值,错误,和标签)。如果你使用嫩枝当你的模板引擎,表单组件提供了一个丰富的集成。
使用集成、你需要的TwigBridge
,它提供了树枝和一些Symfony组件之间的集成。ob娱乐下载如果您使用的是作曲家,你可以通过添加以下安装最新的2.3版本需要
线给你composer.json
文件:
1 2 3 4 5
{“需要”:{“ob娱乐下载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
使用ob娱乐下载\组件\形式\形式;使用ob娱乐下载\桥\嫩枝\扩展\FormExtension;使用ob娱乐下载\桥\嫩枝\形式\TwigRenderer;使用ob娱乐下载\桥\嫩枝\形式\TwigRendererEngine;/ /持有所有的树枝文件的默认标记呈现形式/ /这个文件TwigBridge美元defaultFormTheme=“form_div_layout.html.twig”;美元vendorDir= realpath (__DIR__。“/ . . /供应商”);/ /路径TwigBridge所以树枝可以定位/ / form_div_layout.html。树枝文件美元vendorTwigBridgeDir=美元vendorDir。' ob娱乐下载/ 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枝过ob娱乐下载滤器自己,通过自己的树枝扩展。
使用内置的集成,确保您的项目已Symfony的翻译ob娱乐下载配置组件安装。如果您使用的是作曲家,你可以获得最新的2.3版本的每一个通过添加以下给你composer.json
文件:
1 2 3 4 5 6
{“需要”:{“ob娱乐下载symfony /翻译”:2.3“。*”,“ob娱乐下载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
使用ob娱乐下载\组件\形式\形式;使用ob娱乐下载\组件\翻译\翻译;使用ob娱乐下载\组件\翻译\加载程序\XliffFileLoader;使用ob娱乐下载\桥\嫩枝\扩展\TranslationExtension;/ /创建一个翻译美元翻译=新翻译(“en”);/ /加载一些翻译美元翻译- >addLoader (“xlf”,新XliffFileLoader ());美元翻译- >addResource (“xlf”,__DIR__。“/道路/ /翻译/ messages.en.xlf”,“en”);/ /添加TranslationExtension(给我们反式和transChoice过滤器)美元嫩枝- >addExtension (新TranslationExtension (美元翻译));美元formFactory=形式::createFormFactoryBuilder ()/ /……- >getFormFactory ();
根据您的翻译正在加载,您现在可以添加字符串键,如字段标签和他们的翻译给你翻译文件。
翻译的更多细节,请参阅翻译。
验证
表单组件带有紧(但可选)与Symfony的验证器组件的集成。ob娱乐下载如果您正在使用一个不同的解决方案验证,没有问题!简单的表单的提交/绑定数据(这是一个数组或对象)和通过自己的验证系统。
使用Symfony的验证器组件的集成,首先确保它是安装在ob娱乐下载您的应用程序。如果您使用的是作曲家和想要安装最新的2.3版本,添加你composer.json
:
1 2 3 4 5
{“需要”:{“ob娱乐下载symfony /验证器”:2.3“。*”}}
如果你不熟悉Symfony的验证器组件,阅读更多关于它:ob娱乐下载验证。有一个表单组件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
使用ob娱乐下载\组件\形式\形式;使用ob娱乐下载\组件\形式\扩展\验证器\ValidatorExtension;使用ob娱乐下载\组件\验证器\验证;美元vendorDir= realpath (__DIR__。“/ . . /供应商”);美元vendorFormDir=美元vendorDir。' ob娱乐下载/ symfony /形式/ symfony /组件/形式;美元vendorValidatorDir=美元vendorDir。' ob娱乐下载/ symfony /验证器/ symfony /组件/验证器”;/ /创建一个验证器,细节会有所不同美元验证器=验证::createValidator ();/ /核心有内置翻译错误消息美元翻译- >addResource (“xlf”,美元vendorFormDir。' /资源/翻译/ validators.en.xlf ',“en”,“验证”);美元翻译- >addResource (“xlf”,美元vendorValidatorDir。' /资源/翻译/ validators.en.xlf ',“en”,“验证”);美元formFactory=形式::createFormFactoryBuilder ()/ /……- >addExtension (新ValidatorExtension (美元验证器))- >getFormFactory ();
为了了解更多,跳过了表单组件部分。
访问表单工厂
应用程序只需要一种形式的工厂,一个工厂对象应该用于在应用程序中创建所有表单对象。这意味着您应该创建一些中央,引导您的应用程序,然后访问它的一部分,每当你需要建立一个形式。
请注意
在本文档中,表单工厂总是一个局部变量formFactory美元
。需要指出的是,您可能需要创建这个对象在一些更“全球”的方式,这样你就可以从任何地方访问它。
你是如何获得你的厂是一种形式。如果你使用服务容器,那么您应该将工厂的形式添加到您的容器,当你需要抓住它。如果您的应用程序使用全局或静态变量(通常不是一个好主意),那么您可以将对象存储在一些静态类或做类似的事情。
不管你如何应用程序架构师,只要记住,你应该只有一个工厂和形式,您需要在您的应用程序能够访问它。
创建一个简单的形式
提示
如果你使用Symfony框架,然后工厂形ob娱乐下载式可用自动作为服务调用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 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/ / src / Acme / TaskBundle /控制器/ DefaultController.php名称空间Acme\TaskBundle\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\控制器;使用ob娱乐下载\组件\HttpFoundation\请求;类DefaultController扩展控制器{公共函数newAction(请求美元请求){/ / createFormBuilder是一个快捷的“工厂”/ /然后调用“createBuilder ()”美元形式=美元这- >createFormBuilder ()- >add (“任务”,“文本”)- >add (“dueDate”,“日期”)- >getForm ();返回美元这- >呈现(“AcmeTaskBundle:违约:new.html.twig”,数组(“形式”= >美元形式- >createView ()));}}
正如你所看到的,创建一个形式就像写食谱:你的呼唤添加
为每一个您想要创建的新领域。第一个参数为添加
字段的名称,第二个是“类型”字段。组件有很多形式内置类型。
设置默认值
如果你需要表单加载一些默认值(或者你正在构建一个“编辑”形式),仅仅通过在默认数据创建表单生成器时:
1 2 3 4 5 6 7 8
美元违约=数组(“dueDate”= >新\ DateTime (“明天”),);美元形式=美元formFactory- >createBuilder (“形式”,美元违约)- >add (“任务”,“文本”)- >add (“dueDate”,“日期”)- >getForm ();
1 2 3 4 5 6 7 8
美元违约=数组(“dueDate”= >新\ DateTime (“明天”),);美元形式=美元这- >createFormBuilder (美元违约)- >add (“任务”,“文本”)- >add (“dueDate”,“日期”)- >getForm ();
提示
在这个例子中,默认的数据是一个数组。之后,当你使用data_class选项来将数据直接绑定到对象,默认数据将该对象的一个实例。
呈现形式
既然已经创建了表单,下一步是呈现它。这样做是通过一种特殊的“视图”模板(注意对象$形式- > createView ()
在上面的控制器),使用一组表单辅助函数:
1 2 3 4 5
<形式行动=“#”方法=“职位”{{form_enctype(形式)}}>{{form_widget(形式)}}<输入类型=“提交”/ >< /形式>
就是这样!通过印刷form_widget(形式)
每个字段的形式呈现,以及一个标签和错误消息(如果有的话)。像这是那么容易,不是非常灵活的(还)。通常情况下,你要单独渲染每个表单字段,这样你就可以控制形式的样子。你将学习如何在“形式”一节。
改变窗体的方法和行动
2.3
配置形式方法的能力和行动是在Symfony 2.3中引入的。ob娱乐下载
默认情况下,表单提交相同的URI的形式呈现一个HTTP POST请求。这种行为可以改变使用表单字段类型和表单字段类型选项(方法
选项也使用handleRequest ()
确定是否在表单被提交):
1 2 3 4 5 6
美元formBuilder=美元formFactory- >createBuilder (“形式”,零,数组(“行动”= >“/搜索”,“方法”= >“得到”));/ /……
1 2 3 4 5 6 7 8 9 10 11
/ /……公共函数searchAction(){美元formBuilder=美元这- >createFormBuilder (“形式”,零,数组(“行动”= >“/搜索”,“方法”= >“得到”));/ /……}
处理表单提交
处理表单提交,可以使用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
使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpFoundation\RedirectResponse;美元形式=美元formFactory- >createBuilder ()- >add (“任务”,“文本”)- >add (“dueDate”,“日期”)- >getForm ();美元请求=请求::createFromGlobals ();美元形式- >handleRequest (美元请求);如果(美元形式- >isValid ()) {美元数据=美元形式- >getData ();/ /……执行一些操作,例如将数据保存到数据库中美元响应=新RedirectResponse (“成功/任务/”);美元响应- >准备(美元请求);返回美元响应- >send ();}/ /……
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/ /……公共函数newAction(请求美元请求){美元形式=美元这- >createFormBuilder ()- >add (“任务”,“文本”)- >add (“dueDate”,“日期”)- >getForm ();美元形式- >handleRequest (美元请求);如果(美元形式- >isValid ()) {美元数据=美元形式- >getData ();/ /……执行一些操作,例如将数据保存到数据库中返回美元这- >重定向(美元这- >generateUrl (“task_success”));}/ /……}
这定义了一个常见“工作流”,它包含三种不同的可能性:
- 在最初的GET请求(例如,当用户“冲浪”页面),构建形式和呈现;
如果请求是一个岗位,过程(通过提交的数据handleRequest ()
)。然后:
- 如果表单无效,重新呈现形式(现在将包含错误);
- 如果表单有效,执行一些动作和重定向。
幸运的是,你不需要决定是否提交了一种形式。将当前请求传递给handleRequest ()
方法。然后,表单组件将为你做所有必要的工作。
表单验证
最简单的方式向表单添加验证通过约束
选择在构建每个字段:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
使用ob娱乐下载\组件\验证器\约束\NotBlank;使用ob娱乐下载\组件\验证器\约束\类型;美元形式=美元formFactory- >createBuilder ()- >add (“任务”,“文本”,数组(“约束”= >新NotBlank ()))- >add (“dueDate”,“日期”,数组(“约束”= >数组(新NotBlank (),新类型(“\ DateTime”))))- >getForm ();
1 2 3 4 5 6 7 8 9 10 11 12 13 14
使用ob娱乐下载\组件\验证器\约束\NotBlank;使用ob娱乐下载\组件\验证器\约束\类型;美元形式=美元这- >createFormBuilder ()- >add (“任务”,“文本”,数组(“约束”= >新NotBlank ()))- >add (“dueDate”,“日期”,数组(“约束”= >数组(新NotBlank (),新类型(“\ DateTime”))))- >getForm ();
当表单绑定,这些验证约束将自动应用和旁边的错误会显示字段错误。
请注意
所有的内置的验证约束,明白了验证约束参考。
访问形式错误
2.5
在Symfonob娱乐下载y 2.5之前,getErrors ()
返回的数组FormError
对象。返回值被改变FormErrorIterator
在Syob娱乐下载mfony 2.5。
2.5
的美元深
和美元平
参数在Symfony 2.5中引入的。ob娱乐下载
您可以使用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 (真正的,假);
提示
在年长的Symfoob娱乐下载ny的版本中,getErrors ()
返回一个数组。使用同样的错误在Symfony 2.5或更新版本,你必须通过PHP的ob娱乐下载iterator_to_array功能:
1
美元errorsAsArray= iterator_to_array (美元形式- >getErrors ());
这是有用的,例如,如果您想要使用PHP的array_
函数形式错误。