埋め込みフォームのコレクションを検証するために、Symfony 2.0.4 のコールバック バリデーターを使用しています。フォームのフィールドの 1 つがいずれかのフォームで重複しているかどうかを確認しようとしています。重複している場合は、そのフィールドにエラーを追加します。
コードは次のとおりです。
/**
* @Assert\Callback(methods={"isPriceUnique"})
*/
class Pricing {
protected $defaultPrice;
protected $prices;
public function isPriceUnique(ExecutionContext $context){
//Get the path to the field that represents the price collection
$propertyPath = $context->getPropertyPath().'.defaultPrice';
$addedPrices = $this->getPrices();
\array_unshift($addedPrices, $this->getDefaultPrice());
for($i=0; $i<\count($addedPrices); $i++){
$price=$addedPrices[$i];
$country=$price->getCountry();
//Check for duplicate pricing options(whose country has been selected already)
if($i<\count($addedPrices)-1){
for($j=$i+1; $j<\count($addedPrices); $j++){
if(\strcmp($country, $addedPrices[$j]->getCountry())==0){
$context->setPropertyPath($propertyPath.'.'.$j.'.country');
$context->addViolation('product.prices.unique', array(), null);
break;
}
}
}
}
}
$prices フィールドは Price エンティティの配列で、それぞれに country プロパティがあります。国もフォーム タイプに追加されます。
国プロパティのみにエラーを追加したいのですが、Symfony では $propertyPath.'.field' よりも複雑なものを指定することはできないようです。
階層の下位レベルに設定されたフィールドを指定できるようにする $propertyPath の構文を教えてください。
アップデート:
検証は適切に行われているようで、PropertyPath クラス コンストラクターを調べた後、使用したパスが正しいことを確信しています。問題は、指定されたメッセージが期待どおりに国フィールドに表示されないことです。