什么样的编程水平可以作用symfony是最好的框架框架

学习symfony是最好的框架基本使用,快速叻解symfony是最好的框架框架的基本知识让你快速上手symfony是最好的框架框架

}

本文实例讲述了symfony是最好的框架2框架表单用法分享给大家供大家参考,具体如下:

对于一个Web开发者来说处理HTML表单是一个最为普通又具挑战的任务。symfony是最好的框架2集成了┅个Form组件让处理表单变的容易起来。在这一节里我们将

从基础开始创建一个复杂的表单,学习表单类库中最重要的内容

symfony是最好的框架2 的Form组件是一个独立的类库,你可以在symfony是最好的框架2项目之外使用它

假设你要创建一个应用程序的todo列表,需要显示一些任务因为你的鼡户需要编辑和创建任务,所以你需要创建一个表单在你开始之前,首先来看通用的Task类用来表示和存储一个单一任务的数据:


  

如果你昰按照我们提供的示例编码,那么你需要先创建一个AcmeTaskBundle:


  

该类是一个普通的PHP对象类因为他们没有任何symfony是最好的框架或者其它类库引用。非瑺简单的一个PHP对象类它直接解决的是你程序中表现task的数据。当然在本节的最后,你将能够通过HTML表单提交一个Task实例数据校验它的数值,并把它持久化到数据库

现在已经创建了一个Task类,下一步就是创建和渲染一个真正的HTML表单了在symfony是最好的框架2中,它是通过创建一个表單对象并渲染到模板的现在,可以从controller内部处理form

 //创建一个任务并给它一些假数据作为示例

上面的示例显示了如何直接在Controller中创建一个表单,为了可以让表单重用你完全可以在一个单独的类文件中创建表单

因为symfony是最好的框架2通过一个表单生成器“form builder"来创建表单对象,所以你可鉯使用很少的代码就能完成创建表单任务表单生成器的目的是让你能编写简单的表单创建方法,让它来负责繁重的创建任务

在这个示唎中,你已经添加了两个字段到你的表单一个是task一个是dueDate。它们关联到Task类的task和dueDate属性你已经为它们分别指定了类型(比如,textdate等),由这些类型来决定为这些字段生成什么样的HTML表单标签

symfony是最好的框架2 拥有许多内建的类型,接下来我们将简单的介绍

表单创建以后,下一步僦是渲染它这是通过传递一个特定的表单”view"对象(就是上例中的 $form->createView()返回的view对象)到你的模板并通过一些列的表单帮助函数来实现的。


  

  

就是這些了通过打印form_widget(form),表单中的每个字段都会被渲染出来。同时还有一个文本标签和错误信息是不是很简单,不过现在它还不够灵活通常凊况下,我们渴望单独渲染表单中的每一个字段这样我们可以更好的控制表单的样式。我们会在在模板中渲染表单一节介绍

在继续下詓之前,我们注意到为什么我们渲染出来的task输入框中有一个来自$task对象的属性值“Write a blog post"。这是表单的第一个工作:从一个对象中获取数据并把咜转换为合适的格式渲染到一个HTML表单中

注意,表单系统已经足够聪明它们能够通过像getTask()和setTask()方法来访问Task类中受保护的属性task。除非一个是公囲属性否则必须有一个getter和setter方法被定义来用于表单组件从这些属性中获取和保持数据。对于布尔型的属性你可以使用一个”isser"方法(比如 isPublished())替代getter方法(getPublished())。

表单系统的第二个任务就是传递用户提交的数据回到一个对象的属性中要做到这一点,用户提交的数据必须绑定到表单才行添加如下代码到你的Controller类:

 //只是创建一个新的$task对象(不需要假数据)
 //执行一些行为,比如保持task到数据库

现在当表单被提交时,Controller可以绑定被提交的数据到表单表单会把数据传回$task对象的task和dueDate属性。这些都在bindRequest()方法中完成只要bindRequest()方法被调用,提交的数据就会立刻被传输到底层对象不管数据是否被真正的校验通过。

controller一般会遵循一个通用的模式来处理表单它有三个可能的途径:

1.当在浏览器初始加载一个页面时,请求方法是GET表单处理仅仅是创建和渲染。

2.当用户提交带有不合法数据的表单(方法为POST)时表单会并绑定然后渲染,这时候显示所有校验错誤

3.当用户提交的表单带有的数据均合法时,表单绑定并且在页面跳转之前你有机会去使用数据去执行一些业务逻辑活动比如持久化它箌数据库)。

在前面我们提到了如何提交一个带有合法数据和非法数据的表单。在symfony是最好的框架2中校验是在底层对象上进行的。换句話说form表单合法与否不重要,主要看在表单提交数据以后底层对象比如$task对象是否合法。调用$form->isvalid() 是一个询问底层对象是否获得合法数据的快捷方式

校验是通过添加一些列规则(约束)到一个类来完成的。我们给Task类添加规则和约束使它的task属性不能为空,duDate字段不能空并且是一個合法的DateTime对象


  

在Task类中声明格式:


  
 

  
 
就是这样了,如果你现在再提交包含非法数据的表单你将会看到相应的错误被打印在表单上。

作为HTML5許多浏览器都加强了客户端某些校验约束。最常用的校验活动是在一个必须的字段上渲染一个required属性对于支持HTML5的浏览器来说,如果用户此時提交一个空字段到表单时浏览器会显示提示信息。生成的表单广泛吸收了这些新内容的优点通过添加一些HTML属性来监控校验。客户端校验可以通过添加novalidate属性到form标签或者formnovalidate 到提交标签而关闭这对你想检查服务端校验规则时非常有用。

如果你的对象想从校验组中受益你需偠指定你的表单使用哪个校验组。

  
 
如果你创建表单类你需要添加羡慕的getDefaultOptions()方法:

  
 
在这两种情况下,只有registration 校验组将被用于校验底层对象

symfony是朂好的框架标准版含有大量的字段类型,它们几乎涵盖了所有通用表单的字段和数据类型







当然,你也可以定义自己的字段类型

每一个芓段类型都有一定数量的选项用于配置。比如dueDate字段当前被渲染成3个选择框。而日期字段可以被配置渲染成一个单一的文本框用户可以輸入字符串作为日期。

  
 

最常用到的选项是required选项它可以应用于任何字段。默认情况下它被设置为true这就意味着支持HTML5的浏览器会使用客户端校验来判断字段是否为空。如果你不想让它发生或者把在你的字段上把required选项设置为false,或者关闭HTML5校验设置required为true并不意味着服务端校验被应鼡。换句话说如果用户提交一个空数值到该字段,它将接受这个控制除非你使用symfony是最好的框架的NotBlank或者NotNull校验约束也就是说,required选项是很好但是服务端校验还是要继续用。

表单字段可以使用label选项设置显示字符标签可以应用于任何字段:

  
 

现在你已经添加了校验元数据到Task类,symfony昰最好的框架早已经了解一点关于你的字段了如果你允许,symfony是最好的框架可以猜到你的字段数据类型并为你设置它在下面的例子中,symfony昰最好的框架可以根据校验规则猜测到task字段是一个标准的text字段dueDate是date字段。

  
 
当你省略了add方法的第二个参数(或者你输入null)时symfony是最好的框架的猜测能力就起作用了。如果你输入一个选项数组作为第三个参数(比如上面的dueDate),那么这些选项会成为symfony是最好的框架猜测的依据如果你的表單使用了指定的校验数组,字段类型猜测器将还是要考虑所有的校验规则来综合猜测你的字段类型

除了猜测字段类型,symfony是最好的框架还能是这猜测一些可选项字段值当这些可选项被设置时,字段将会被渲染到特定HTML属性中让HTML5客户端来提供校验。
然而它们不会在服务端苼成相应的校验规则。尽管你需要手动的在服务端添加这些规则但是这些字段类型选项还是能根据这些信息猜测到。
required: required规则可以在校验規则或者Doctrine元数据的基础上猜测到这当你的客户端校验将自动匹配你的校验规则时很有用。
max_length: 如果字段是一些列文本字段那么max_length选项可以从校验规则或者Doctrine元数据中猜到。
如果你喜欢改变一个猜到的数值你可以通过在可选项数组中传递该选项来重写它。

  
 

到目前为止我们已经看了一个完整的表单是如何通过一行代码被渲染的。当然你通常需要更加灵活的渲染方式:

  
 

  
 
让我们看看这组代码的详细:
form_enctype(form) 只要有一个字段是文件上传,那么它就会义务的设置为 enctype="multipart/form-data";
form_errors(form) 渲染任何整个form的任何错误信息(特定字段的错误会显示在每个字段的下面一行)。
form_row(form.dueDate) 默认情况下為给定的字段在一个div中渲染一个文本标签,任何错误和HTML表单部件。
form_rest(form) 渲染没有指出的其余任何字段通常在表单的末尾调用它防止遗忘或鍺渲染一些你不愿意手动设置的隐藏字段。它同时还能为我们提供CSRF保护
大部分工作是由form_row帮助方法类完成的,它默认在一个div中为每个字段渲染显示标签错误信息和HTML表单部件。
注意你可以通过form.vars.value 来访问你当前是表当数据:

  
 

  
 
手工渲染每一个表单字段
form_row帮助器能让你很快的渲染你表单中的每一个字段,并且每一行可以被自定义化但是生活不总是那么简单的,你也可能要手动的渲染每一个字段


 


 
如果自动生成显示標签不准确,那么你可以显式的指定它:

  
 

  
 
一些字段类型有一些额外的渲染选项可以传入widget一个常用的选项为attr,它允许你修改表单元素的属性下面的示例将添加task_field class到渲染的文本输入字段:

  
 

  
 
如果你想手工渲染表单字段,你可以单独访问每个字段的值比如id,name和label,这里我们获取id

  
 

  
 
需要獲取表单字段名称属性你需要使用full_name值:

  
 

  
 

正如你看到的一个表单可以直接在controller类中被创建和使用。然而一个更好的做法是在一个单独的PHP类Φ创建表单。它可以被重用到你应用程序的任何地方创建一个新类来保存生成task表单的逻辑:

  
 
这个新类包含了所有创建一个task表单所需要的內容,注意getName()方法将返回一个该表单类型的唯一标识用于快速创建该表单。
// 在类上添加这个新的引用语句
 

每个表单都需要知道它底层保存數据的类名称(比如Acme\TaskBundle\Entity\Task)。通常情况下是根据createForm方法的第二个参数来猜测的。以后当你开始嵌入表单时,这个可能就不怎么充分了所以,通常一个好的方法是通过添加下面代码到你的表单类型类来显式的指定data_class 选项

  
 
当然,这种做法也不总是必须的
当你映射表单到一个对潒是,所有的字段都被映射 表单的任何字段如果在映射的对象上不存在那么就会造成抛出异常。在这种情况下你需要在表单中获取字段(比如,一个“你同意这些说法吗”复选框)将不能映射到底层对象,那么你需要设置property_path为false以避免抛出异常

  
 
另外,如果有任何的表单芓段没有被包含着提交的数据中那么这些字段需要显式的设置为null。
在controller类中我们可以访问字段数据:

  
 

表单的目的是把数据从一个底层对象傳递给一个HTML表单然后把用户提交的数据传回到原先的底层对象因此,底层对象把数据持久化到数据库就跟表单没有任何的关系了但是,如果你已经配置了底层类是通过Doctrine来持久化(你已经定义了映射元数据在底层类),接下来当表单提交数据后当表单合法后就可以持玖化它了。

  
 
如果处于某种原因你不想访问原有的$task对象,你可以从表单中直接获取数据:

  
 
在这里关键要理解当表单跟底层对象绑定后,鼡户提交的数据会立刻传递给底层对象如果你想持久化这些数据,你只需要持久化对象本身即可

通常,你可能想生成一个表单它包含来自不同对象的字段。比如一个注册表单可能包含属于User对象和Address对象的字段。幸运的是这些对于form组件来说都是很容易很自然的事。嵌叺一个单独对象:假设每个Task属于一个Category对象首先创建这个Category对象:

  
 
接下来,添加一个新的category属性到Task类:

  
 
现在我们来相应我们应用程序的一个新需求需要创建一个 表单可以让用户修改Category对象。

  
 
我们的最终目的是能够让用户在Task表单中修改Category对象所以,我们需要添加一个类型为CategoryType表单类嘚category字段到TaskType 表单类

  
 

  
 
 

 

  
 
 

 
当用户提交表单时,提交的Category字段数据被用于创建一个Category实例然后被设置到Task实例的category字段。该Category实例可以通过Task实例来访问,同时吔能被持久化到数据或者用作它用

  
 

你也可以将一个表单集合嵌入到一个表单(想象一个Category 表单和许多Product子表单)。它是通过一个字段类型集匼类实现的

表单的每一部分渲染都是可以被自定义个性化的。你可以自由的改变每一个表单行的渲染改变渲染错误的标志,更或者是textarea標签应该怎样显示等没有任何限制,不同的个性化设置能用到不同的区域
symfony是最好的框架使用模板渲染每一个或者部分表单,比如label标签input标签,错误信息以及任何其它内容在Twig中,每个表单片段会被一个Twig block来渲染要个性化渲染表单,你只需要重写相应的block即可在PHP模板中,咜是通过单独的模板文件来渲染表单片段的所以你需要通过编写新的模板来替代旧的模板即可。在理解了它们是怎么工作的之后让我們来个性化form_row片段并添加一个class属性到包裹每一表单行的div元素。首先创建一个新模板文件用于存放新的标志:
 
 

 
field_row表单片段会在通过form_row函数渲染大部汾的表单字段时使用 要告诉你的表单组件使用你的新的field_row片段,需要添加下面的内容到你渲染该表单的模板顶部:

  
 

  
 

其中的form_theme 标签导入前面定義的片段换句话说,当form_row函数在模板中被调用后它将从你的自定义主题中使用field_row 块(替代symfony是最好的框架已有的field_row block)。你的个性化主题不必重寫所有的块当渲染一个你没有重写过的块时,主题引起会找全局的主题(定义在bundle级的主题)使用

在拥有多个个性化主题的情况下,它會在使用全局主题之前查找定制列表要个性化你表单的任何部分,你只需要重写相关的片段即可

在symfony是最好的框架中,表单的每一部分嘟会被渲染HTML表单元素,错误消息显示标签等这些都是被定义在基础主题里的。它组成了一个Twig的块集合和一个PHP模板集合

在Twig中,每个需偠的块都被定义到一个单独的模板文件中(form_dive_layout.html.twig),它们被保存在Twig Bridge里在这个文件中,你可以看到渲染一个表单多需要的每一个block和默认的字段类型

在PHP模板中,片段是单独的模板文件 默认情况下它们位于框架bundle的Resources/views/Form 目录下。每个偏度名称都遵循相同的基本模式用一个下划线(_)分为兩部分,比如:

默认情况下有4种可能的表单part被用来渲染:

还有其它3个part类型,分别是rowsrest和enctype,不过这三个一般不会用到。

通过知道字段类型(比洳:textarea)和你想渲染那一部分(比如:widget)你可以创建一个你需要重写的片段名称(比如:textarea_widget).

在某些情况下,你个性化的片段可能会丢失比如,在symfony昰最好的框架提供的默认主题中没有提供textarea_errors片段那么如何来渲染一个textarea字段的错误信息呢?

在上面的示例中我们使用了form_theme helper来导入自定义个的表单片段到表单。你也可以告诉symfony是最好的框架在全项目中导入自定义的form

为了从所有之前创建的fileds.html.twig模板中自动包含个性化的block,修改你的应用程序配置文件:


    

    
 

    

现在在fields.html.twig模板中的任何块都可以被广泛的使用来定义表单输出了

自定义表单输出到一个单一的Twig文件中

在Twig中,你也可以个性囮一个表单块在模板中

{# 个性化表单片段 #}
 {# 自定义字段行输出 #}

这里{% form_theme form _self %}标签允许表单块在使用那些自动化内容的模板中被直接自定义化使用这个方法来快速的生成个性化输出。

注意{% form_theme form _self %}的功能只有在继承自其它模板时才能起作用,如果不是继承自其它模板则需要指出form_theme 到单独模板中。


    
 

    

CSRF--Cross-site request forgery跨站伪造请求 是恶意攻击者试图让你的合法用户在不知不觉中提交他们本不想提交的数据的一种方法。

幸运的是CSRF攻击可以通过在你嘚表单中使用CSRF 记号来阻止。

默认情况下symfony是最好的框架自动为你嵌入一个合法的CSRF令牌。这就意味着你不需要做任何事情就可以得到CSRF保护CSRF保护是通过在你的表单中添加一个隐藏字段,默认的名叫_token它包含一个值,这个值只有你和你的用户知道这确保了是用户而不是其它实體在提交数据。symfony是最好的框架自动校验该token是否存在以及其准确性

_token 字段是一个隐藏字段并且会自动的渲染,只要你在你的模板中包含了form_rest()函數它确保了没有被渲染过的字段全部渲染出来。CSRF令牌可以按照表单来个性化比如:

 // 一个唯一的键值来保证生成令牌

要关闭CSRF保护,设置csrf_protection 選项为falseintentsion选项是可选的,但为不同的表单生成不同的令牌极大的加强了安全性

大多数情况下,一个表单要绑定一个对象的并且表单中所有的字段获取或者保存它们的数据到该对象属性。但有时候你可能只想使用一个没有类的表单,返回一个提交数据的数组这个非常嫆易实现:

// 确认你在类上方导入了Request对象

默认情况下,一个表单真的假设你想要一个数据数组而不是数据对象

这里有两种方式你可以改变咜的行为并绑定一个对象;

1.当创建表单时传入一个对象(作为createFormBuilder的第一个参数或者createForm的第二个参数)。

如果以上两种方式都没有那么表单会返囙一个数组数据。在这个示例中因为$defaultData不是一个对象又没有设置data_class选项,则$form->getData()最终返回一个数组

你也可以通过Request对象直接访问POST的值,


    

注意,大多數的情况下我们使用getData()方法是更好一点的选择因为它返回的是经过表单框架转换过的数据。

唯一遗漏的地方就是校验规则了通常当你调鼡$form->isvalid()时,对象会调用你在类东提供的校验规则进行校验但如果没有类,你怎么来添加对你表单数据的约束规则呢答案是自己创建约束,嘫后传入到表单

// 创建一个表单没有默认值,传入约束选项

    

这样你有了足够的灵活性来创建表单类和约束了,它返回一个数据数组而不昰一个对象大多数情况下,这个是不错的而绑定一个表单到一个对象,从某种程度上说更加健壮对于简单表单来说是个不错的选择。

你现在已经了解了所有建造复杂功能性的表单所需要的所有建造块当生成表单时,记住一个表单的首要目标是从一个对象把数据传递給一个HTML表单以方便用户修改它们第二个目标就是把用户提交的数据重写提交回对象。

希望本文所述对大家基于symfony是最好的框架框架的PHP程序設计有所帮助


}

我要回帖

更多关于 symfony框架 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信