您不能在未绑定的表单上调用isValid() - Symfony

时间:2012-06-20 21:57:33

标签: forms symfony doctrine

我尝试用Symfony创建一个表单,但我收到一个错误:

  

您不能在未绑定的表单上调用isValid()。

  1. 我有类用户,带有注释和Doctrine保存在DB中。类用户具有使用Doctrine生成的getter和setter。

  2. 我有UserTye.php:

    <?php
    
    namespace Iftodi\DesignBundle\Form;
    
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilder;
    
    class UserType extends AbstractType
    {
    
        public function buildForm(FormBuilder $builder, array $options)
        {
            $builder->add('name');
            $builder->add('username');
            $builder->add('email','email');
            $builder->add('password','password');
    
        }
    
        public function getName()
        {
            return "userRegister";
        }
    }
    
    ?>
    
  3. 在控制器中:

    function registerAction()
    {
        $user = new User();
        $form = $this->createForm(new UserRegister(),$user);
    
        $request = $this->getRequest();
    
        if($request->getMethod() == 'POST')
            $form->bindRequest ($request);
    
        if($form->isValid())
        {
    
        }
    
        return $this->render("IftodiDesignBundle:User:register.html.twig", 
                array('form' => $form->createView())
                );
    }
    

2 个答案:

答案 0 :(得分:4)

如果您有发布请求,则只绑定表单,但始终在其上调用isValid。正如消息所说:如果没有约束,你就不能。像这样重新组织您的代码:

if ("POST" === $request->getMethod()) {
    $form->bindRequest($request);

    if ($form->isValid()) {
    }
}

答案 1 :(得分:1)

Maelyn的回答是正确的。

这是代码的更新代码段:适用于Symfony 2.1 +

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

    if ($form->isValid()) {
        // do something with $form
    }
}

参考:http://symfony.com/blog/form-goodness-in-symfony-2-1#no-more-bindrequest

如果您不在控制器中但在枝条扩展中,您可以通过捆绑包中的services.yml中的服务注入声明传递请求堆栈(注意Symfony 2.4版本)。

参考:http://symfony.com/doc/current/book/service_container.html#injecting-the-request

services:
  your_service_name:
     class: YourBundle\YourTwigExtension
     arguments: [@request_stack]

然后在您的扩展程序中

namespace YourBundle;

use Symfony\Component\HttpFoundation\RequestStack;

class YourTwigExtension extends \Twig_Extension
{
   private $request;

   public function __construct(RequestStack $request_stack)
   {
       $tmp_request = $request_stack->getCurrentRequest();
       if ($tmp_request) 
       {
          $this->request = $tmp_request;
       }
   }

   // add your filter/function/extension name declarations ...       

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

                  if ($form->isValid()) 
                  {
                      // do something with $form
                  }
             }
        }
   }

}