Когда вызывать валидатор в формах Symfony?

Я не знаю, когда вызвать проверку в этой ситуации? Я сделал некоторые ограничения в классе Form/Model/User.php для свойств, и не знаю, где и как его вызвать. И как отображать ошибки на той же странице.Как лучше всего делать это правильно?

public function userRegistrationAction(Request $request) {
$formUser = new FormUser();
$form = $this->createForm(UserType::class, $formUser);
$form->handleRequest($request);

if($form->isSubmitted() && $form->isValid()) {
  $userEntity = new EntityUser();

  $name = $form['name']->getData();
  $surname = $form['surname']->getData();
  $email = $form['email']->getData();
  $password = $this->get('security.password_encoder')
    ->encodePassword($userEntity, $form['password']->getData());
  $now = new\DateTime('now');

  $userEntity->setName($name);
  $userEntity->setSurname($surname);
  $userEntity->setEmail($email);
  $userEntity->setPassword($password);
  $userEntity->setCreated($now);

  $entityManager = $this->getDoctrine()->getManager();
  $entityManager->persist($userEntity);
  $entityManager->flush();

  $request->getSession()
    ->getFlashBag()
    ->add('success', '- Success! ');

   return $this->render('AppBundle:Welcome:homepage.html.twig', array(
     'name' => $name,
     'lastName' => $surname,
   ));
}

2 ответа

Решение

Хорошо, это была проблема: 'validation_groups' => ['registration'], я установил эту группу только для одного поля, теперь я удаляю это и работаю хорошо, нет необходимости в валидаторе callig после isValid.

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'validation_groups' => ['registration'], //delete this 
        'method' => 'post',
        'data_class' => User::class,
        'csrf_protection' => true,
        'cascade_validation' => true
    ));
}

Вы создали сущность formUser, чтобы заполнить форму, а затем заполнить сущность пользователя? Это делает много увольнений.

Ваш контроллер должен выглядеть так:

<?php

public function userRegistrationAction(Request $request)
{
    $userEntity = new EntityUser();

    /*
      You can directly provide your user entity to your form
      There is no need to create a specific entity fir the form
    */ 
    $form = $this->createForm(UserType::class, $userEntity);

    $form->handleRequest($request);

    /*
      method isValid checks the form has been submitted so there 
      is no need to call isSubmitted by yourself
    */
    if ($form->isValid()) {
        /*
          The password encryption part could be improved by 
          doing it outside of the controller
        */
        $password = $this->get('security.password_encoder')
            ->encodePassword($userEntity, $userEntity->getPassword())
        ;
        $userEntity->setPassword($password);

        $entityManager = $this->getDoctrine()->getManager();

        /*
          By providing your user at your form at the begining all it
          remains to do is persisting it and flush the manager
          to insert it into your database.
        */
        $entityManager->persist($userEntity);
        $entityManager->flush();

        $this->addFlash('success', '- Success! ');

        return $this->render('AppBundle:Welcome:homepage.html.twig', array(
             'name' => $name,
             'lastName' => $surname,
        ));
    }

    return $this->render('AppBundle:User:userRegistration.html.twig', array(
        'form' => $form->createView()
    ));
}

Теперь ваша форма должна выглядеть так

<?php

class UserType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')
            ->add('surname')
            ->add('email')
            ->add('password', PasswordType::class)
            ->add('submit', SubmitType::class)
        ;
    }

    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\EntityUser',
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'user_type';
    }
}

Ваша сущность EntityUser

<?php

/**
 * @ORM\HasLifecycleCallbacks()
 */
class EntityUser extends Entity
{
     /**
      * @ORM\PrePersist
      */
     public function setCreatedAtValue()
     {
        /*
          By using the PrePersist annotation you will automatically set
          the createdAt property
        */
        $this->createdAt = new \DateTime();
     }
}

И, наконец, ваш шаблон веточки

{# form_row is a shortcut to render at once
        form_errors(form.field)
        form_label(form.field)
        form_widget(form.field)
    so if you have errors on some of your fields there will be displayed #}

{{ form_start(form) }}
    {{ form_row(form.name) }}
    {{ form_row(form.surname }}
    {{ form_row(form.email) }}
    {{ form_row(form.password) }}
    {{ form_row(form.submit) }}
{{ form_end(form) }}
Другие вопросы по тегам