2012-06-20 36 views
0

我試圖創建Symfony的形式,但我收到一個錯誤:你不能沒有結合在窗體上調用的isValid() - Symfony的

You cannot call isValid() on a form that is not bound.

  1. 我有類用戶與註釋和學說保存在數據庫中。 Class用戶具有由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()) 
          ); 
    } 
    

回答

4

你只綁定你的表格,如果你有一個POST請求,但總是調用的isValid就可以了。正如消息所說:如果沒有約束,你不能。像這樣重組你的代碼:

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

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

謝謝。我用你的解決方案解決了我的問題。 –

+1

你好@DanIftodi,歡迎來到Stackoverflow。如果這個答案解決了你的問題,你可以[接受它](http://meta.stackexchange.com/a/5235/182741)! – j0k

1

梅林的答案是正確的。

下面的代碼的更新片段:爲symfony1.2 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 
        } 
      } 
     } 
    } 

} 
相關問題