验证约束
打开注解约束的配置: # 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
时间: 2024-10-12 13:41:13