Symfony2 细节小计4

Symfony2 细节小计4

验证约束

打开注解约束的配置:
# app/config/config.yml
framework:
    validation: { enable_annotations: true }
控制器中校验实体:
$validator = $this->get('validator');
$errors = $validator->validate(实体对象); //检验失败则返回错误列表对象
---count($errors) AND ($errorsString = (string) $errors); 
|
---{% for error in errors %} {
   {error.message}} {% endfor %}  #每个错误代表了一个 ConstraintViolation

表单验证:
$form = $this->createForm(new 表单类(), 空实体对象);
$form->handleRequest($request); 
if ($form->isValid()) {
  return $this->redirectToRoute(...);
} 
return $this->render('author/form.html.twig', array(
   'form' => $form->createView(),
));
 
 直接调用验证函数:
 $emailConstraint = new Assert\Email();
 $emailConstraint->message = 'Invalid email address';
 $errorList = $this->get('validator')->validate(
        $email,
        $emailConstraint
    );
use Symfony\Component\Validator\Constraints as Assert;
可以约束的对象: 属性约束、 Getters公共方法(get,is,has开头的方法)、 类约束(可用callback等来约束整个类)


验证组,将实体的校验规则分不同组,校验时激活验证指定组的规则:default组、 类名组。
例子,registration组:
$errors = $validator->validate($author, null, array('registration')); //通过验证组来验证, 没有指定约束,则使用default组来验证

设定验证组验证顺序:
 * @Assert\GroupSequence({"User", "Strict"}) //在类头部有序注解出验证组
 
 验证组序列provider(指定那些验证组激活)
 * @Assert\GroupSequenceProvider  //在类头部注解使用验证组provider
 集成接口: implements GroupSequenceProviderInterface
 实现方法: getGroupSequence
 返回 激活的验证组名字的数组

表单

表单对象的设计意图:
映射请求数据到实体对象 或 映射实体对象到表单字段输出
更方便的对请求数据校验实体类的验证规则
实现代码复用, 将表单收编到自己的可用组件库中

## 最佳实践的建议 ##
# 推荐在模板中编写表单按钮
# 在表单类或者控制器中添加输入域
# 一般不要把表单注册为服务
创建表单类 -> 实例化表单对象 -> 表单处理提交并验证 -> 返回空表单或跳转 -> 模板绘制表单

## 创建表单 ##
//自定义类创建表单/
namespace xxBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class MyType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title')
            ->add('summary', 'textarea')
            ->add('authorEmail', 'email')
            ->add('publishedAt', 'datetime')
            ->add('save','submit',array('label'=>'yes')); #不推荐表单类中添加按钮,应在模板中
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'xxBundle\Entity\My',
            'validation_groups' => array('registration'), # 指定表单校验时, 使用实体的哪个校验组
                                                          # 'validation_groups'=>false 关闭校验,但还会执行些基础检查
                                   # array('AppBundle\Entity\Client','determineValidGp')通过client类的一个回调方法来决定验证组
                                   # 回调方法接收参数 FormInterface $form
        ));
    }

    public function getName()
    {
        return 'My';
    }
}
//或者 控制器中创建表单//
use AppBundle\Entity\Post; #实体类
public function xxAction(Request $request)
{
   $form = $this->createFormBuilder(new Post()【, $options】)
		        【->setAction($this->generateUrl('target_route'))】
		        【->setMethod('GET')】
		        ->add('name')  #忽略add第二参数或为null, 则自动推断类型
		        ->add('file')
		        ->getForm();
}
// $options = array(
    'validation_groups' => array('registration'), //指定表单校验时, 使用实体的哪个校验组
)
##################################################################


## 实例化表单 ##
use AppBundle\Entity\Post; #实体类
use xxBundle\Form\MyType; #表单类
public function xxAction(Request $request)
{
    $post = new Post();
    $post->setTitle('this is title');
    $form = $this->createForm(new MyType(), $post【, array(
        'action' => $this->generateUrl('target_route'),
        'method' => 'GET',
    )】);
    ...
}
##################################################################


## 表单提交 处理验证 ##
# isValid验证会先内部调用isSubmitted,但为了语义明显,还是推荐显示调用下isSubmitted
use AppBundle\Entity\Post; #实体类
use xxBundle\Form\MyType; #表单类
public function xxAction(Request $request) {
	$post = new Post();
	$form = $this->createForm(new MyType(), $post);
	$form->handleRequest($request); //处理post提交请求,验证数据并写入实体对象,验证失败则将显示报错信息。
                                        //get请求也能识别。
	if ($form->isSubmitted() && $form->isValid()) { //表单验证
		$em = $this->getDoctrine()->getManager();
		$em->persist($post); //或者 $em->persist($form->getData());
		$em->flush();
        	
		return $this->redirect($this->generateUrl(
		    'post_show',
		    array('id' => $post->getId())
		));
	} else { //渲染空表单
		return $this->render('form.html.twig', array(
		   'form' => $form->createView(),
		));
	}
}
##################################################################


## 模板绘制表单 ##
/单行代码粗放绘制///
{
   { form_start(form【, {'attr': {'class': 'blog-form'}}】) }}
    {
   { form_widget(form) }} <!-- 所有字段和表单报错 -->
    <input type="submit" value="yes" class="btn" />
{
   { form_end(form) }} <!-- CSRF Token及一些其他隐藏字段 -->
///或者 表单控件行绘制
{
   { form_start(form【, {'action': path('target_route'), 'method': 'GET'}】) }}
    {
   { form_errors(form) }} <!-- 表单的报错 -->
    {
   { form_row(form.title) }} <!-- title字段及其报错 -->
    {
   { form.vars.value.title }} <!-- 输出当前的title模板变量 -->
{
   { form_end(form) }}
///或者更细致的 表单字段绘制
{
   { form_start(form) }}
    {
   { form_errors(form) }} <!-- 表单的报错 -->

    <div> <!-- 这里的一个div相当于form_row -->
        {
   { form_label(form.dueDate【, '2015-10'】) }}  <!-- 可临时替换标签文本 -->
        {
   { form_errors(form.dueDate) }}
        {
   { form_widget(form.dueDate【,{'attr': {'class': 'dateclass'}}】) }}
        {
   { form.dueDate.vars.id }} <!-- 输出字段的某属性 -->
    </div>
    {
   { form_widget(form.save) }}
{
   { form_end(form) }}
##################################################################
## 控制器中读写表单字段 ##
$form->get('dueDate')->getData();
$form->get('dueDate')->setData(new \DateTime());

## 检测表单按钮点击 ##
$form->get('save')->isClicked(); //检测save按钮是否被点击

## 临时关闭客户端的required等校验功能 ##
{
   { form(form, {'attr': {'novalidate': 'novalidate'}}) }}
或
submit按钮添加属性 'attr' => array('novalidate' => 'novalidate'),

## 表单字段配置 ##
$builder->add('名字', '类型', array(
'label'    =>    'yes',  #标签文字,false则不显示
'attr'     =>    array('class'=>'btn'),
'validation_groups' => false, # 适用于submit按钮
'required  =>    true, #前端html5实现字段必填
'mapped'   =>    false, #该字段不映射到实体, 比如是否同意勾选框,没有此设置,则抛异常:字段不存在于实体 
))
表单字段类型: 
文字类:text、textarea、email、integer、number、password、url
选择类:choice(下拉)
时间类:date、datetime、time
其他类:checkbox、radio、file
组框:collection
隐藏域:hidden
按钮类:button、reset、submit

转载于:https://my.oschina.net/u/2400083/blog/519616

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/109287.html原文链接:https://javaforall.net

(0)
上一篇 2021年9月10日 上午7:00
下一篇 2021年9月10日 上午7:00


相关推荐

  • 常见音频编码格式解析

    常见音频编码格式解析常见音频编码格式解析常见音频编码格式解析MP3编码格式1MP3概述2MPEG音频压缩基础3MPEGLayer3编解码的基本原理4整个MP3文件结构41ID3V242音频数据帧43ID3v1AAC编码格式1AAC概述2AAC扩展名3AAC规格4AAC特点5AAC音频格式解析51AAC音频格式有ADIFADTSLATM52ADIF和ADTS的header53ADIF和

    2022年6月26日
    39
  • 常用软件写网页html,新手用什么软件写html网页比较靠谱

    常用软件写网页html,新手用什么软件写html网页比较靠谱这里所说的网页是指包含javascript代码在内的html静态网页(在做动态网站时称之为模版页)。我接触页面制作的时候连基本的css语法都不会,之前也很少用table的方式写,所以直接从div+css学起,开始是看别人写好的网页,然后分析他们的每一行代码,后来发现这样学习不太适合我,于是就把一个结构不太复杂的网页截图,然后照着图片来写html结构的网页。开始的时候连基本的margin、paddi…

    2022年5月30日
    42
  • Spring整合MyBatis——超详细

    Spring整合MyBatis——超详细Spring整合MyBatis——超详细一、Spring整合MyBatis的三个关键点二、整合步骤1、创建一个Maven项目2、在pom.xml文件中添加jar包的依赖2、配置MyBatis文件(1)新建一个实体类的包和User实体类(2)编写实体类(3)新建Mapper接口包和UserMapper接口(3)新建jdbc资源文件jdbc-config.properties(4)新建mybatis配置文件mybatis.xml(5)新建logj4j的日志配置文件log4j.properties

    2022年6月5日
    50
  • 13 个最好用的免费服务器和网络监控工具,不看吃亏!

    13 个最好用的免费服务器和网络监控工具,不看吃亏!1、GangliaGanglia是伯克利开发的一个集群监控软件。可以监视和显示集群中的节点的各种状态信息,比如如:cpu、mem、硬盘利用率,I/O负载、网络流量情况等,同时可以将历史数据以曲线方式通过php页面呈现。Ganglia监控软件主要是用来监控系统性能的软件,如:cpu、mem、硬盘利用率,I/O负载、网络流量情况等,通过曲线很容易见到每个节点的工作状态,对合理调整、分配系统资源…

    2022年5月27日
    45
  • oncontextmenu 事件

    oncontextmenu 事件用户点击鼠标右键时触发并打开上下文菜单禁用:document.oncontextmenu=function(){   returnfalse;}编辑自定义右键打开菜单document.oncontextmenu=function(){   returnfalse; } document.body.addEventListener(‘mousedown’…

    2022年10月16日
    4
  • BitBlt参数详解[通俗易懂]

    BitBlt参数详解[通俗易懂]对BitBlt()这个函数的最后一个参数的意义一直不是太了解,只会使用SRCCOPY,最近的一个项目使用到了这个函数,但是要求要背景透明的将源绘制到目标区域上,源是背景色和字,怎么只拷贝字而把背景色透明化呢??我的解决方法是,把源的背景色绘制为白色,字为黑色,然后在BitBlt的时候最后一个参数用SRCAND,果然可以达到我要的效果,这是为什么呢?呵呵趁此机会好好看看这个参数介绍吧~~开始之前,首先要明白,绘制其实就是在给每一个像素点涂颜色,每种颜色都是由红蓝黄三要素组合而成,因此通过RGB颜色值可以

    2022年10月18日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号