标签:
打开注解约束的配置:
# 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 关闭校验
));
}
public function getName()
{
return ‘My‘;
}
}
//////或者 控制器中创建表单//////////
use AppBundle\Entity\Post; #实体类
public function xxAction(Request $request)
{
$form = $this->createFormBuilder(new Post()【, $options】)
->add(‘name‘)
->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);
...
}
##################################################################
## 表单提交 处理验证 ##
# 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->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) }}
///////或者 表单控件独立绘制////////
##################################################################
## 检测表单按钮点击 ##
$form->get(‘save‘)->isClicked(); //检测save按钮是否被点击
## 临时关闭客户端的required等校验功能 ##
{{ form(form, {‘attr‘: {‘novalidate‘: ‘novalidate‘}}) }}
或
submit按钮添加属性 ‘attr‘ => array(‘novalidate‘ => ‘novalidate‘),
## 表单字段配置 ##
$builder->add(‘名字‘, ‘类型‘, array(
‘label‘ => ‘yes‘,
‘attr‘ => array(‘class‘=>‘btn‘),
))
字段类型: text, date
标签:
原文地址:http://my.oschina.net/u/2400083/blog/519616