Symfony 2验证表

时间:2014-10-29 11:09:08

标签: forms validation symfony bind

我是新人,我需要一些帮助。

当我尝试验证表单时遇到问题。

在我的不同文件下面:

AmiAttrbType.php

<?php

namespace Site\TestBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

 class AmiAttrbType extends AbstractType
  {

  /**
   * @param FormBuilderInterface $builder
   * @param array $options
   */
   public function buildForm(FormBuilderInterface $builder, array $options)
   {
      $builder
        ->add('email','text', array(
            'required' => true,
            'attr' => array(
            'placeholder' => 'Adresse Mail'
        )))
        ->add('produitsAttrb','collection', array(
            'type' => new ProduitAttrbType()
        ));
    }

   /**
   * @param OptionsResolverInterface $resolver
   */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Site\TestBundle\Entity\Ami'
        ));
    }

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

ProduitAttrbType.php

<?php

namespace Site\TestBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class ProduitAttrbType extends AbstractType
{

    /**
   * @param FormBuilderInterface $builder
   * @param array $options
   */
  public function buildForm(FormBuilderInterface $builder, array $options)
  {

        $builder
            ->add('nom', 'hidden')
            ->add('qte','integer', array(
            'required' => true
            ));
  }

  /**
   * @param OptionsResolverInterface $resolver
   */
  public function setDefaultOptions(OptionsResolverInterface $resolver)
  {
    $resolver->setDefaults(array(
        'data_class' => 'Site\TestBundle\Entity\ProduitAttrb'
    ));
  }

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

Controller.php这样

public function attrbAction(Event $commande)
{   
   $ami = new Ami;

   foreach($commande->getProduits() as $produit)
   {
      $ami->addProduitsAttrb(new ProduitAttrb($produit->getNom(),0));
   }

   $form = $this->createForm(new AmiAttrbType(),$ami);


   $request = $this->get('request');

   if( $this->get('request')->getMethod() == 'POST' )
   {  
       $form->bind($request);

       if ($form->isValid())
       {

           $commande->addAmi($ami);

           $em = $this->getDoctrine()->getManager();
           $em->merge($commande);

           $em->flush();

            return $this->render('SiteTestBundle:Test:attrb.html.twig', array('commande' =>$commande, 'form' => $form->createView()));
      }
   } 

    return $this->render('SiteTestBundle:Test:attrb.html.twig', array('commande' =>$commande, 'form' => $form->createView()));
}

attrb.html.twig:

<tr>
    <td  class="attrb-new">
        <div class="row">
            <div class="col-xs-12">
               {{ form_widget(form.email) }}
             </div>
       </div>
   </td>
   {% for produit in form.produitsAttrb %}
      <td class="attrb-newQte">
        {{ form_widget(produit.qte) }}
       </td>
    {% endfor %}
   {{ form_rest(form) }}
</tr>

我有两个案例: 如果在控制器中我使用bind($ request),我有两个错误:

- Email empty (email has been entered)
- Token invalid (token exist in my source code)

我不明白为什么会出现这种错误。

如果我使用handleRequest($request),则不会发生任何事情。

我的symfony版本更高,但是bindhas总是有效。

当我在我的树枝代码中删除此部分时,我有bind($request)

{% for produit in form.produitsAttrb %}
      <td class="attrb-newQte">
        {{ form_widget(produit.qte) }}
      </td>
{% endfor %}

这是有效的。

请你能帮助我。

提前谢谢。

问候

1 个答案:

答案 0 :(得分:0)

您应该将Request对象传递给action而不是从服务中获取它。像这样:

public function testAction(Request $request, $myOtherArgs)
{
    ....
    $form->handleRequest($request);
    ...
}

另外,如果您想查看导致错误的原因,可以在调用handleRequest后对表单进行var_dump:

var_dump($form->getErrors(true));