2017-02-22 6 views
0

1つのフィールドが空でない(長さ> 0)場合、検証されるフィールドの長さは特定の長さ(2文字)である必要があります。このような状況では "Assert \ Expression"が機能するかもしれませんが、プロパティの長さを見つけようとしています。 Expression内でphp関数を呼び出せないようです。 expression documentationには関数が記述されていますが、わかりません... strlen()を返すだけの独自の関数を登録する必要がありますか?もしそうなら、あなた自身の機能をどのように登録しますか?これを実行する方法がある、または多分私が見下ろす午前の式を使用してより良い方法があれば、誰かが上記の場合...Symfonyバリデーション別のプロパティに依存する

/** 
* @var string 
* 
* @ORM\Column(name="plate", type="string", length=10) 
*/ 
private $plate; 

/** 
* @var string 
* 
* @ORM\Column(name="state", type="string", length=2) 
* @Assert\Expression(
*  "strlen(this.getPlate()) == 0 or (strlen(this.getPlate()) > 0 and strlen(value) == 2)", 
*  message="Must be 2 characters" 
*)  
*/ 
private $state; 

を説明することができ、私はエラーにThe function "strlen" does not exist around position 1

+0

http://symfony.com/doc/current/reference/constraints/Length.html – Cerad

+0

フィールドを空にするか、空でない場合は2文字の長さにする必要があります。 – jkrnak

+0

はい、それは他のプロパティ "PLATE"に依存しています... PLATEが空の場合STATEも空ですが、PLATEに何か(長さ> 0)があればSTATEは2の長さでなければなりません – snoop168

答えて

1

ルックスを取得しますあなた自身の機能を登録する必要がありますように。ドキュメントを見てください:https://symfony.com/doc/current/components/expression_language/extending.html#registering-functions

lowercaseの例があります。strlenは非常に似ているはずです。

EDIT

また、コールバックバリデータを使用することができます。

/** 
* @Assert\Callback() 
*/ 
public function validateState(ExecutionContextInterface $context) 
{ 
    if (!empty($this->plate) && mb_strlen($this->state) !== 2) { 
     $context->buildViolation('State must be 2 characters long') 
      ->atPath('state') 
      ->addViolation(); 
    } 
} 

しかし、あなたが複数の場所での検証のこの種を使用することを計画している場合は、次のように記述して独自のバリデータを登録することができます。

+0

1つの変更を除いて作業...関数定義を持っていなければならない: 'public function validateState(ExecutionContext $ context)'(削除された "Interface") – snoop168

関連する問題