2011-10-24 11 views
1

更新:私は何の答えも得ていないので、もっと簡単な例を使って投稿全体を書き直しました。うまくいけば、これは問題を明らかにするのに役立ちます。Assertアノテーションを使用したsymfony2の検証が機能しない

フォームの検証に問題があります。私はNotBlank()アサーションを動作させることができますが、Type()は私のためには機能しません。まず、コードは次のとおりです。

/* ...\Entity\LineItem.php */ 
<?php 

namespace Rialto\ExperimentBundle\Entity; 

use Symfony\Component\Validator\Constraints as Assert; 

class LineItem 
{ 
    /** 
    * @var integer 
    * @Assert\NotBlank() 
    * @Assert\Type(type="integer") 
    */ 
    private $quantity = 0; 

    public function getQuantity() 
    { 
     return $this->quantity; 
    } 

    public function setQuantity($quantity) 
    { 
     $this->quantity = $quantity; 
    } 
} 

/* ...\Controller\DefaultController.php */ 
<?php 

namespace Rialto\ExperimentBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpFoundation\Response; 

use Rialto\ExperimentBundle\Entity\LineItem; 


class DefaultController extends Controller 
{ 
    public function indexAction() 
    { 
     return $this->testValidation(); 
    } 

    private function testValidation() 
    { 
     $item = new LineItem(); 

     $form = $this->createFormBuilder($item) 
      ->add('quantity', 'integer') 
      ->getForm(); 

     $request = $this->getRequest(); 
     if ($request->getMethod() == 'POST') { 
      $form->bindRequest($request); 

      if ($form->isValid()) { 
       return new Response('Form is valid.'); 
      } 
     } 

     return $this->render('RialtoCoreBundle:Form:basicForm.html.twig', array(
      'form' => $form->createView(), 
     )); 
    } 
} 

入力を空白のままにすると、予想通りにエラーメッセージが表示されます。しかし、入力に「adsf」と入力すると、「Form is valid」という出力が表示されます。私はYAMLとPHPバリデーションを使って同じことを試みました。誰かが私が間違って行ったことを見ることができますか?それは、私はそれが役に立てば幸いちょうどguess..Butだ

$request->isPost() 

:このため

$this->isPost($request) 

: -

おかげで、 イアン

答えて

9

これが期待どおりに動作しない理由は、SymfonyのスタブのNumberFormatter実装のバグが原因です。 PHP intl拡張がインストールされていない場合は、スタブ実装が使用されます。

基本的に、数値フォーマッタは値とreturns false when it finds that it starts with a non-numeric characterを解析しようとします。それは変圧器で例外をトリガーするエラーコードを設定しなければなりませんが、そうでないのでブール値falseが使用され、gets typecast to an integer(これもバグです)。したがって、 "adsf"入力は整数0として終了し、型アサーションを渡します。

私はan issue report about thisを見つけました。私は2つのバグに対してそれに対してプルリクエストを送信しました。

あなたは問題を解決するためにそれらのパッチを使用するか、1

+1

すばらしい答え!リンク、特にバグレポートに感謝します。 –

0

は、あなたがこれを変更すべきかもしれません!

+0

に設定された制限付きMin assertionを追加することによって、今のところ、それを回避することができ、私は言及を忘れてしまったこと 'ます$ this-> isPost($リクエスト)私が書いた方法です。これは '$ request-> getMethod()== 'POST'と同じです。また、そのブロック内のコードが(必要なように)実行されているので、それは問題だとは思わない。 –

関連する問題