だから、私はコレクションを持っているフォームを持っていて、ユーザーはこのコレクションに新しいアイテムを追加することができます。このコレクションの私のエンティティには、IDと整数があります。ユーザーが最初のアイテムよりも整数が小さいアイテムを次々に追加できないことを検証したいと思います。
たとえば、フォームは空で、ユーザーは[追加]ボタンをクリックしてコレクションにレコードを追加します。彼は入力フィールドに100を入力し、別のレコードを追加して、入力フィールドに50を入力します。彼が送信しようとすると、50が100未満であるため、2番目のレコードにエラーが発生するようにしますが、リストの後に追加しました。
これが私のFormTypesとEntitesです
class ItemType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('value');
}
}
class ItemCollectionType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('items', 'collection', array(
'type' => new ItemType(),
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
'label' => false,
));
$builder->add('save');
}
}
class Item
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="integer", nullable=true)
*/
protected $value;
}
class List
{
/**
* @ORM\OneToMany(targetEntity="Item", cascade={"persist"})
* @Assert\Valid
**/
private $items;
}
コントローラーで検証を実行できると思いますが、エンティティで検証またはカスタム検証を使用して検証を実行したいと思います。
**編集**
DonCallistoが提案したことも実行できますが、彼が提案したようなグローバルクラスだけでなく、問題のある特定の行でエラーが発生しようとしています。
問題のアイテムにpropertyPathを追加する方法が見つかりません。次のコードを使用しようとしましたが、アイテム自体ではなく、クラスでエラーをバインドしているようです。
$context->addViolationAt(
$context->getPropertyPath().'.items.data.value',
'Your violation message'
);
また、現在の要素は考慮されません。
次のコードも機能していません。ここでは、テストのためだけに配列のキーをハードコーディングしています。
$context->addViolationAt(
$context->getPropertyPath().'.items[0].data.value',
'Your violation message'
);
コレクション内の子の値にアクセスするためのパスを正しく設定する方法を誰かに教えてもらえますか?
私はDonCallistoの答えの一部を使用して、私はからコードを移動し、私の質問への答えを見つけたList
エンティティへのItem
私のように呼び出していますことをバリデータとでCLASS_CONSTRAINT
私のItem
エンティティ。
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
/**
* @Annotation
*/
class ItemsOrderedValidator extends ConstraintValidator {
public function validate($value, Constraint $constraint) {
foreach ($value->getList()->getItems() as $item) {
$currentValue = $item->getValue();
if (isset($prevValue) && $prevValue >= $currentValue && $value === $item) {
$this->context->buildViolation($constraint->message)
->atPath('value')
->addViolation();
}
$prevValue = $currentValue;
}
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加