gpt4 book ai didi

symfony2 表单验证和约束

转载 作者:行者123 更新时间:2023-12-04 05:41:12 25 4
gpt4 key购买 nike

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

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

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

  • 所以跳过其中的前两个,让我们一起看看第三步
    <?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(...)来电。

    所以,进入我的 Controller ,我已经做到了
    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'));
    }

    但是当我提交表格时,我将不得不与这个错误作斗争

    Expected argument of type array or Traversable and ArrayAccess, object given



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

    最佳答案

    尝试这样的事情:

    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 安全性。手动编码不是一个好主意
    Controller 中的密码。

  • 编辑:

    你得到这个异常是因为你不能使用 validation_constraint处理对象的表单中的选项。

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

    关于symfony2 表单验证和约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11221798/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com