2016-05-25 11 views
0

は私が教義を呼び出すのSymfony 2でカスタム制約の検証を構築していないフィールドの近くに表示しますフォームの上部。カスタム制約の検証は、時にはSymfony2の

は、私はこのような注釈と私のカスタムバリデータを呼び出す:

/** 
* @var string 
* 
* @ORM\Column(name="duree_p", type="decimal", precision=3, scale=2, nullable=true) 
* @MyAssert\ExceedCharge 
*/ 
private $dureeP; 

奇妙なことは、いくつかのフィールドは、それはそれに次のエラーを表示する形式ですが、他人のためにそれが一番上にエラーが表示されます。

私はこの記事をStackOverflowで見ました:Custom constraint validation error doesn't display next to field in Symfony2しかし、それは私を助けませんでした。

"atPath()"オプションを試してみましたが、成功しませんでした。私は理解していない何

が、それは私が欲しい1のためのいくつかのフィールドといないために働くということです...

誰でも任意の手掛かりを持っていますか?

EDIT:私も違反メッセージが発生した場合、違反メッセージに関連するフィールドが「いいえので、任意の「は、エラー」クラスを持っていないことに気づいた

EDIT 2:ここで

は私の制約ロジックです:

class ExceedChargeValidator extends ConstraintValidator 
{ 

    protected $em; 

    public function __construct(EntityManager $em) 
    { 
     $this->em = $em; 
    } 

    public function validate($value, Constraint $constraint) 
    { 
     dump($value); //DEBUG 
     dump($this->context); //DEBUG 

     //get id to perform search 
     $id = $this->context->getObject()->getCast()->getId(); 


     $consomme = $this->em->getRepository('AppBundle:Intervention')->getConsomme($id); 

     $charge = $this->context->getObject()->getCast()->getCharge(); 

     $prevu = $this->context->getObject()->getDureeP(); 
     $realise = $this->context->getObject()->getDureeR(); 

     dump($prevu); //DEBUG 
     dump($realise); //DEBUG 

     if($value != 0) { 
      $total = $value + $consomme; 
      if($total > $charge) { 
      $this->context->buildViolation($constraint->message1) 
       ->setParameter('%string%', $value) 
       ->addViolation(); 
      dump($this->context->getPropertyPath()); 
     } 
     dump($this); //DEBUG  
    } 

     dump($consomme);//DEBUG 
     dump($charge); //DEBUG 
    } 
} 

そして、ここでは私のエンティティのfielsの一部です210

/** 
* @var \DateTime 
* 
* @ORM\Column(name="date", type="date") 
*/ 
private $date; 

/** 
* @var string 
* 
* @ORM\Column(name="duree_p", type="decimal", precision=3, scale=2, nullable=true) 
* @MyAssert\ExceedCharge 
*/ 
private $dureeP; 

/** 
* @var string 
* 
* @ORM\Column(name="duree_r", type="decimal", precision=3, scale=2, nullable=true) 
* @Assert\GreaterThan(
*  value = 0 
*) 
*/ 
private $dureeR; 

フォームが簡単に管理バンドルここ

Here is what I got if I attach the same constraint violation to different fields. We can see that it works fine on my "date" field but for the "dureeP" field the message is displayed at the top

によって生成されているが、私は別のフィールドに同じ制約違反を添付する場合、私が得たものです。 "日付"フィールドで正常に動作することがわかりますが、 "dureeP"フィールドではメッセージが上部に表示されます

答えて

0

atPathはあなたのConstraintがStringに適用されるPropertyConstraintであり、文字列には子がありません。

ただし、プロパティ制約で違反が発生した場合、違反はプロパティの名前(存在する場合)のフィールドに添付されます。したがって、フォームにdureePフィールドがある場合は、エラーがフィールドに付加されます。そうでない場合はフォームのルートになります。

+0

こんにちは:ここ

は、私がトラブルシューティングに使用バリです!ご清聴ありがとうございます。私は確かに "dureeP"という名前のフィールドと "date"という名前のフィールドを持っています。私は "日付"フィールドにアサートを添付しますが、その横に違反メッセージが表示されますが、 "dureeP"フィールドにアサートを添付すると、その上に違反メッセージが表示されます。なぜ私のフィールドの一部で動作し、私が欲しいものではないのかわかりません:/ – Lucien

+0

もっとコードを貼り付けてください。 (フィールド "date"と "dureeP" +完全な制約ロジックがうまくいく) – Terenoth

+0

私はあなたに詳細を教えてくれます。 – Lucien

0

問題が見つかりました。

問題は、列名に「_」(アンダースコア)が含まれていたことが原因でした。

私は

@ORM\Column(name="prevu", type="decimal", precision=3, scale=2) 

では

@ORM\Column(name="duree_p", type="decimal", precision=3, scale=2) 

を交換し、それが問題を解決しました。名前にはアンダースコアがないので、完了です!

どうやってそれを見つけましたか? ダミー(基本)バリデーターテストを作成し、それを自分の別のエンティティの別のフィールドに貼り付けることで、私はそれがすべてのフィールドで働いているのを見たので、私は2つのエンティティの違いを比較し、それは唯一の違いでした。

class TestValidator extends ConstraintValidator 
{ 

    protected $em; 

    public function __construct(EntityManager $em) 
    { 
     $this->em = $em; 
    } 

    public function validate($value, Constraint $constraint) 
    { 

     dump($value); 

     if(!preg_match('/^[0-9]+$/', $value, $matches)) { 
      $this->context->buildViolation($constraint->message) 
       ->setParameter('%string%', $value) 
       ->addViolation(); 
     } 

    } 
} 
関連する問題