使用Symfon2中的表单事件添加@Assert \ All

时间:2016-02-16 08:54:50

标签: symfony

我只是symfony的新手。

我在我的应用程序中使用symfony 2.0.23,我的实体上有以下断言:

/**
 * @var \Doctrine\Common\Collections\Collection $discountLevelItems
 *
 * @ORM\OneToMany(targetEntity="DiscountLevelItem", mappedBy="discountLevel", cascade={"persist", "remove"})
 * @CustomAssert\Count(min="1", minMessage="Must provide at least one item.")
 * @Assert\All(constraints={
 *     @CustomAssert\UniqueInCollection(propertyPath="supplier", message="Duplicate suppliers are not allowed.")
 * })
 * @Assert\Valid
 */
private $discountLevelItems;

我想删除@Assert \ All(具有CustomAssert)并在特定表单事件期间添加它。

我该怎么做?

感谢!

2 个答案:

答案 0 :(得分:1)

只需从注释中删除它,创建一个callback并实现自己的逻辑。

另请注意,只需使用validation groups

即可达到类似行为

答案 1 :(得分:1)

第一个解决方案:基于事件。

从实体

中删除Assert \ All

在表单中添加如下内容:

use Symfony\Component\Validator\Constraints\All;
    // add this one in any event do you want.
    $builder
        ->add('field', 'fieldtype', [
            'constraints' => [new All(...)],
        ])

第二个解决方案:验证组

我在下面的注释中添加了groups修饰符。

/**
 * @var \Doctrine\Common\Collections\Collection $discountLevelItems
 *
 * @ORM\OneToMany(targetEntity="DiscountLevelItem", mappedBy="discountLevel", cascade={"persist", "remove"})
 * @CustomAssert\Count(min="1", minMessage="Must provide at least one item.")
 * @Assert\All(constraints={
 *     @CustomAssert\UniqueInCollection(propertyPath="supplier", message="Duplicate suppliers are not allowed.", groups = {'validation1'})
 * })
 * @Assert\Valid
 */

在此修改后,将validation_groups => 'validation1'添加到您的表单。

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults([
        'data_class' => '\Acme\DemoBundle\Entity\Demo',
        'validation_groups' => 'validation1',
    ]);
}

以另一种形式,您可以将validation_groups添加为validation2,注释将在具有validation2的表单中禁用。

有关详细信息,请查看:http://symfony.com/doc/2.0/book/validation.html