symfony2表单验证和约束

时间:2012-06-27 08:00:54

标签: symfony validation

我刚刚创建了一个表单,它必须“捕获”数据以将它们传输到“用户对象”并将其保存到DB。

为了做到这一点,我遵循以下步骤:

  1. 创建用户对象
  2. 创建一个UserRepository以使其持久化并获取它(通过实体管理器)
  3. 创建一个“映射”表单的类
  4. 创建路线和模板以渲染整个事物
  5. 所以跳过前两个,让我们一起看第三步

    <?php
    namespace Sestante\UserBundle\Form\Type;
    
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilder;
    use Symfony\Component\Validator\Constraints\Email;
    use Symfony\Component\Validator\Constraints\MinLength;
    use Symfony\Component\Validator\Constraints\Collection;
    
    class AddUserType extends AbstractType
    {
        public function BuildForm(FormBuilder $builder, array $options)
        {
            $builder->add('username','text')
                    ->add('email','email')
                    ->add('id','hidden')
                    ->add('password','text')
                    ;
        }
    
        public function getName()
        {
            return 'AddUser';
        }
    

    这是我为“表格句柄”创建的课程的一部分 显然我想在我的表单中添加某种验证,然后symfony2 book我已经完成了这个

    public function getDefaultOptions(array $options)
    {
        $collectionConstraint = new Collection(array(
            'username'=> new MinLength(4),
            'email'=>new Email(array('message'=>'invalid email address')),
        ));
    
        return array(
            'data_class' => 'Sestante\UserBundle\Entity\User',
            'validation_constraint' => $collectionConstraint
        );
    }
    

    据我了解,我们会在$form->bindRequest(...)->bind(...)来电时检查约束。

    所以,进入我的控制器,我已经完成了这个

    public function insertAction(Request $request)
    {
       if($request->getMethod() == 'POST'){
           $em = $this->getDoctrine()->getEntityManager();
           $user = $em->getRepository('SestanteUserBundle:User');
           $userObj = new User();
           $userObj->setSalt('prova');
           $parameters = $request->request->get('AddUser');
           $parameters['password'] = sha1($parameters['password']);
           $userObj->setGroups($em->getRepository('SestanteUserBundle:Groups')->find(3));
           $form = $this->createForm(new AddUserType(), $userObj);
           $logger = $this->get('logger');
           $logger->info('PROVA: '.gettype($parameters));
           $form->bind($parameters); /* al posto che fare un bind della form, faccio un bind normale con i parametri presi dalla post e modificati
                                     vedi la password che deve subire uno sha1 */
           $em->persist($userObj);
           $em->flush();
           return $this->redirect($this->generateUrl('SestanteUserBundle_homepage'));
       }
    

    但是当我提交表格时,我将不得不努力解决这个错误

      

    类型数组或Traversable和ArrayAccess对象的预期参数   给定

    最奇怪的是,此操作中涉及的唯一两个对象(绑定参数和约束集合)是请求的类型。 所以我不知道如何超越这个 有什么想法吗?

1 个答案:

答案 0 :(得分:3)

尝试这样的事情:

public function insertAction(Request $request)
{
    // First: Create you're object with only what you need
    $userObj = new User();

    // Then, build you're form
    $form = $this->createForm(new AddUserType(), $userObj);

    // Form submitted?
    if ($request->getMethod() == 'POST') {
        $request = $this->getRequest();
        $em = $this->getDoctrine()->getEntityManager();

        // Bind $request now !
        $form->bindRequest($request);

        // Your object is updated (not saved, ofc). You can now do what you want.
        $userObj->setPassword(sha1($user->getPassword());
        $userObj->setGroups($em->getRepository('SestanteUserBundle:Groups')->find(3));

        // Finish, save user
        $em->persist($userObj);
        $em->flush();

        return $this->redirect($this->generateUrl('SestanteUserBundle_homepage'));
    }
}

其他一些事情:

  • 您不需要在表单中添加id字段。
  • 你应该看一下sf2的安全性。手动编码不是一个好主意 控制器中的密码。

修改

您遇到此异常是因为您无法在处理对象的表单中使用validation_constraint选项。

此选项只能与数据数组一起使用。