2017-01-15 4 views
0

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

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, 
    )); 
} 

ответ

0

ОК, это была проблема: «validation_groups» => [ «регистрация»], я установил эту группу только для одного поля, теперь я удалить это и не работает хороший, нет необходимости в callig валидатор после -Valid.

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 
    )); 
} 
+1

$ form-> isValid() будет автоматически проверять форму для вас, пока вы настроили валидации, больше ничего не требуется. – Baig

0

Вы создали объект 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) }} 
+0

Я нашел, в чем была проблема, tnx для приятной рекламы – dion

 Смежные вопросы

  • Нет связанных вопросов^_^