Validation Symfony2+;条令-验证一对多实体集合
我有一个表单来创建一个新实体。该实体具有也以该形式输入的其他实体的集合 我想使用集合中实体的验证选项来验证这些实体,但它不起作用。检查“主要”实体(人员)的验证规则,但不检查Validation Symfony2+;条令-验证一对多实体集合,validation,symfony,collections,doctrine,one-to-many,Validation,Symfony,Collections,Doctrine,One To Many,我有一个表单来创建一个新实体。该实体具有也以该形式输入的其他实体的集合 我想使用集合中实体的验证选项来验证这些实体,但它不起作用。检查“主要”实体(人员)的验证规则,但不检查地址列表集合(地址)中实体的验证规则。当我在字段中输入无效信息时,提交的表单将成功验证 在本例中,街道的注释不用于验证 class Person { ... /** * @ORM\OneToMany(targetEntity="Address", mappedBy="owner", cascad
地址列表
集合(地址)中实体的验证规则。当我在字段中输入无效信息时,提交的表单将成功验证
在本例中,街道的注释不用于验证
class Person
{
...
/**
* @ORM\OneToMany(targetEntity="Address", mappedBy="owner", cascade={"persist", "detach"})
*/
protected $addressList;
....
}
class Address
{
...
/**
* @ORM\ManyToOne(targetEntity="Person", inversedBy="addressList")
* @ORM\JoinColumn(name="person_id", referencedColumnName="id", onDelete="CASCADE")
*/
protected $owner;
/**
* @ORM\Column(type="string", length=75)
* @Assert\MinLength(
* limit=3,
* message="Street must have atleast {{ limit }} characters."
* )
*/
protected $street;
...
}
如何获取表单以验证提供的地址实体?您还可以将“”约束与“”约束一起使用:
/**
* @ORM\OneToMany(targetEntity="Address", mappedBy="owner", cascade={"persist", "detach"})
* @Assert\All({
* @Assert\Valid
* })
*/
protected $addressList;
我也有同样的问题,但通过以下方法解决了:
/**
* @ORM\OneToMany(
* targetEntity="Entity",
* mappedBy="mappedEntity",
* cascade={"persist" , "remove"}
* )
* @Assert\Valid
*/
我用这个:
use Symfony\Component\Validator\ExecutionContextInterface;
class Person
{
...
/**
* @ORM\OneToMany(targetEntity="Address", mappedBy="owner", cascade={"persist", "detach"})
*/
protected $addressList;
....
/**
* @Assert\Callback
*/
public function validate(ExecutionContextInterface $context)
{
if (!$this->getAddressList()->count()) {
$context->addViolationAt(
'addressList',
'You must add at least one address',
array(),
null
);
}
}
}
只需添加注释断言,如下所示
/**
* @Assert\Count(
* min = "1",
* minMessage = "You must specify at least one"
* )
* @Assert\Valid
*
*/
protected $name_of_collection_property;
我通过将
'cascade\u validation'=>true
添加到PersonType的getDefaultOptions()
数组中解决了这个问题。你确定吗?这使我在2.1中“约束有效不能嵌套在约束Symfony\Component\Validator\Constraints\All中。您只能直接在字段或方法上声明有效约束。”不再确定。我想当时我正在使用2.0,我不得不处理一个类似的问题。如果它不起作用,也许我应该删除我的答案。我在3.3和@Assert\Valid()中遇到了类似的问题,但没有@Assert\All环绕它似乎可以正常工作。而且,很明显,我们也要摆脱“…Valid不能嵌套在…All…”中的错误消息。还要将@Assert\Valid添加到$addressList中,这将是完整的解决方案。这将验证列表中的每个地址是否仅为有效的地址实体。但是,如果您想进行更多验证,请查看@sergey Polishook下面的答案@Assert\Valid
,它可以验证集合中许多一侧的所有约束,这正是我所需要的。