0

Symfonyでフォームを作成しようとしていますが、エラーが発生します:

バインドされていないフォームでisValid()を呼び出すことはできません。

  1. アノテーションとDoctrineがDBに保存されているUserクラスがあります。クラスユーザーには、Doctrineで生成されたゲッターとセッターがあります。

  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

2 に答える 2

4

post リクエストがある場合にのみフォームをバインドしますが、常に isValid を呼び出します。メッセージが示すように、バインドされていない場合はできません。次のようにコードを再編成します。

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

    if ($form->isValid()) {
    }
}
于 2012-06-21T03:55:13.650 に答える
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

コントローラーではなく twig 拡張機能を使用している場合は、バンドルの 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
                  }
             }
        }
   }

}
于 2014-01-21T00:34:55.550 に答える