表单组件
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.1,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
表单组件
表单组件允许您轻松地创建、处理和重用HTML表单。
表单组件是一个工具来帮助您解决问题,允许终端用户与应用程序的数据和修改数据。尽管传统上这是通过HTML表单组件集中处理数据从客户端和应用程序,这些数据是否被从一个正常的形式或从一个API。
安装
您可以安装组件在两个不同的方面:
- 使用官方的Git存储库(https://github.com/ob娱乐下载symfony/Form);
- 安装它通过作曲家(
ob娱乐下载symfony /形式
在Packagist)。
配置
提示
如果你正在与完整Symfony框架,已经为你配置表单组件。ob娱乐下载在这种情况下,跳过表单组件。
在Syob娱乐下载mfony2,形式是由对象和由这些对象使用形式的工厂。建立一种工厂很简单:
1 2 3
使用ob娱乐下载\组件\形式\形式;美元formFactory=形式::createFormFactory ();
这个工厂已经可以用于创建基本形式,但它缺乏支持非常重要的特点:
- 请求处理:支持请求处理和文件上传;
- CSRF保护:支持保护跨站请求伪造(CSRF)攻击;
- 模板:与模板的集成层,允许重用HTML片段在呈现一种形式;
- 翻译:支持翻译错误消息,字段标签和其他字符串;
- 验证:集成验证库为提交的数据生成错误消息。
Symfob娱乐下载ony2表单组件依赖于其他库来解决这些问题。大部分的时间你会用树枝和Symfonyob娱乐下载HttpFoundation、翻译和验证器组件,但是你可以取代这些不同图书馆的你的选择。
下面的小节解释如何将这些库插入到工厂。
提示
请求处理
处理表单数据,您需要获取信息的请求(一般$ _POST
数据),通过提交数据的数组bind ()。表单组件选择与Symfony的集成ob娱乐下载HttpFoundation组件使这更容易。
集成HttpFoundation组件,添加HttpFoundationExtension你的工厂形式:
1 2 3 4 5 6
使用ob娱乐下载\组件\形式\形式;使用ob娱乐下载\组件\形式\扩展\HttpFoundation\HttpFoundationExtension;美元formFactory=形式::createFormFactoryBuilder ()- >addExtension (新HttpFoundationExtension ())- >getFormFactory ();
现在,当你处理一个表单,您可以通过请求的对象bind ()而不是提交原始数组的值。
请注意
更多的信息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
,它提供了树枝和几个Symfony2组件之间的集成。ob娱乐下载如果您使用的是作曲家,你可以通过添加以下安装最新的2.1版本需要
线给你composer.json
文件:
1 2 3 4 5
{“需要”:{“ob娱乐下载symfony / twig-bridge”:2.1“。*”}}
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
使用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的集成ob娱乐下载翻译
组件,或添加2枝过滤器自己,通过自己的树枝扩展。
使用内置的集成,确保您的项目Symfony的ob娱乐下载翻译
和配置组件安装。如果您使用的是作曲家,你可以获得最新的2.1版本的每一个通过添加以下给你composer.json
文件:
1 2 3 4 5 6
{“需要”:{“ob娱乐下载symfony /翻译”:2.1“。*”,“ob娱乐下载symfony /配置”:2.1“。*”}}
接下来,添加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.1版本,添加你composer.json
:
1 2 3 4 5
{“需要”:{“ob娱乐下载symfony /验证器”:2.1“。*”}}
如果你不熟悉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
使用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美元
。需要指出的是,您可能需要创建这个对象在一些更“全球”的方式,这样你就可以从任何地方访问它。
你是如何获得你的厂是一种形式。如果你使用:术语'Service容器”,那么您应该将工厂的形式添加到您的容器和抓住它,无论你什么时候需要。如果您的应用程序使用全局或静态变量(通常不是一个好主意),那么您可以将对象存储在一些静态类或做类似的事情。
不管你如何应用程序架构师,只要记住,你应该只有一个工厂和形式,您需要在您的应用程序能够访问它。
创建一个简单的形式
提示
如果你使用Symfony2框架,然后工厂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
美元违约=数组(“dueDate”= >新\ DateTime (“明天”),);美元形式=美元formFactory- >createBuilder (“形式”,美元违约)- >add (“任务”,“文本”)- >add (“dueDate”,“日期”)- >getForm ();
提示
在这个例子中,默认的数据是一个数组。之后,当你使用data_class选项来将数据直接绑定到对象,默认数据将该对象的一个实例。
呈现形式
既然已经创建了表单,下一步是呈现它。这样做是通过一种特殊的“视图”模板(注意对象$形式- > createView ()
在上面的控制器),使用一组表单辅助函数:
1 2 3 4 5
<形式行动=“#”方法=“职位”{{form_enctype(形式)}}>{{form_widget(形式)}}<输入类型=“提交”/ >< /形式>
就是这样!通过印刷form_widget(形式)
每个字段的形式呈现,以及一个标签和错误消息(如果有的话)。像这是那么容易,不是非常灵活的(还)。通常情况下,你要单独渲染每个表单字段,这样你就可以控制形式的样子。你将学习如何在“形式”一节。
处理表单提交
处理表单提交,可以使用bind ()方法:
- 独立使用
- 框架的使用
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日
使用ob娱乐下载\HttpFoundation\请求;使用ob娱乐下载\组件\HttpFoundation\RedirectResponse;美元形式=美元formFactory- >createBuilder ()- >add (“任务”,“文本”)- >add (“dueDate”,“日期”)- >getForm ();美元请求=请求::createFromGlobals ();如果(美元请求- >isMethod (“职位”)){美元形式- >bind (美元请求);如果(美元形式- >isValid ()) {美元数据=美元形式- >getData ();/ /……执行一些操作,例如将数据保存到数据库中美元响应=新RedirectResponse (“成功/任务/”);美元响应- >准备(美元请求);返回美元响应- >send ();}}/ /……
这定义了一个常见“工作流”,它包含三种不同的可能性:
- 在最初的GET请求(例如,当用户“冲浪”页面),构建形式和呈现;
如果请求是一个岗位,过程(通过提交的数据绑定
)。然后:
- 如果表单无效,重新呈现形式(现在将包含错误)
- 如果表单有效,执行一些动作和重定向;
请注意
如果你不使用HttpFoundation,直接通过“POST”数据绑定
:
1 2 3 4 5
如果(收取(美元_POST(美元形式- >getName ()))) {美元形式- >bind (美元_POST(美元形式- >getName ())/ /……}
如果你上传文件,你需要通过合并做一点工作$ _POST
数组的带有_file美元
数组传递到之前绑定
。
表单验证
最简单的方式向表单添加验证通过约束
选择在构建每个字段:
- 独立使用
- 框架的使用
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 ();
当表单绑定,这些验证约束将自动应用和旁边的错误会显示字段错误。
请注意
所有的内置的验证约束,明白了验证约束参考。