【问题标题】:symfony2 form validation and constraintsymfony2 表单验证和约束
【发布时间】:2012-06-27 08:00:54
【问题描述】:

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

为此,我按照以下步骤操作:

  1. 创建用户对象
  2. 创建一个 UserRepository 以使其持久化并获取它(通过实体管理器)
  3. 创建一个“映射”表单的类
  4. 创建用于渲染整个事物的路由和模板

所以跳过前两个步骤,让我们一起看看第三步

<?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-&gt;bindRequest(...)-&gt;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 类型的预期参数,对象 给定

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

【问题讨论】:

    标签: symfony validation


    【解决方案1】:

    试试这样的:

    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 选项。

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

    【讨论】:

    • 关于“在控制器中手动编码”我遵循page 说“将用户密码直接编码到控制器中”。那么,替代方案是什么?为什么编写这本食谱的 symfony 开发人员会说不同呢?但是,我正在更改我的代码以尝试您的答案
    • 关于密码编码,直接使用sha1方法。在食谱中,调用了编码器。关于您的问题,您可以将堆栈跟踪粘贴到某处吗?如果去掉validation_constraint,表单是否正常工作?
    • 是的,如果我删除validation_constraint 一切都很好。任何一种方法:我的和你的。
    • 调用和编码器和直接编码到控制器有什么区别?
    • 我太愚蠢了...您不能在编辑...对象的表单中使用validation_constraint 选项。它仅适用于数组。
    猜你喜欢
    • 2014-04-05
    • 2014-04-11
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 2015-03-20
    • 2015-02-13
    • 1970-01-01
    • 2018-02-07
    相关资源
    最近更新 更多