Validation 有效约束不支持symfony2中的组选项
我需要以symfony2形式级联验证,除非针对指定的组 这里symfony团队告诉我们,组选项在有效约束中不受支持 怎么做 详情: 我有一个用户实体具有address属性,它是address实体的外键。此外,我还有一个名为business的实体,它将用户作为属性,也将地址属性作为属性。我需要为用户验证地址,但当用户是企业财产时,不验证地址 模式Validation 有效约束不支持symfony2中的组选项,validation,symfony-2.3,Validation,Symfony 2.3,我需要以symfony2形式级联验证,除非针对指定的组 这里symfony团队告诉我们,组选项在有效约束中不受支持 怎么做 详情: 我有一个用户实体具有address属性,它是address实体的外键。此外,我还有一个名为business的实体,它将用户作为属性,也将地址属性作为属性。我需要为用户验证地址,但当用户是企业财产时,不验证地址 模式 Class Address { ... } Class User { /** * @Assert\Valid(group
Class Address {
...
}
Class User {
/**
* @Assert\Valid(groups={"user"})
*/
private $address;
}
Class Business {
/**
* @Assert\Valid(groups={"business"})
*/
private $user;
/**
* @Assert\Valid(groups={"business"})
*/
private $address;
}
因此,我只需要验证用户表单中的地址,而不需要验证业务中的地址
谢谢您可以在用户表单类型中添加验证规则。 别忘了删除注释
好的,我有一个解决办法。回调约束确实有“groups”选项,我们可以在这里使用它。在回调中,我们将调用所需实体的验证 我将使用php代码添加约束,但您可以使用注释 用户实体
// ...
public static function loadValidatorMetadata(ClassMetadata $metadata)
{
$metadata->addConstraint(new Assert\Callback(array(
'methods' => array('validAddress'),
'groups' => array('user'),
)));
}
public function validAddress(ExecutionContextInterface $context)
{
$context->validate($this->address, 'address', $context->getGroup());
}
// ...
public static function loadValidatorMetadata(ClassMetadata $metadata)
{
$metadata->addConstraint(new Assert\Callback(array(
'methods' => array('validUser'),
'groups' => array('business'),
)));
$metadata->addConstraint(new Assert\Callback(array(
'methods' => array('validAddress'),
'groups' => array('business'),
)));
}
public function validUser(ExecutionContextInterface $context)
{
$context->validate($this->user, 'user', $context->getGroup());
}
public function validAddress(ExecutionContextInterface $context)
{
$context->validate($this->address, 'address', $context->getGroup());
}
企业实体
// ...
public static function loadValidatorMetadata(ClassMetadata $metadata)
{
$metadata->addConstraint(new Assert\Callback(array(
'methods' => array('validAddress'),
'groups' => array('user'),
)));
}
public function validAddress(ExecutionContextInterface $context)
{
$context->validate($this->address, 'address', $context->getGroup());
}
// ...
public static function loadValidatorMetadata(ClassMetadata $metadata)
{
$metadata->addConstraint(new Assert\Callback(array(
'methods' => array('validUser'),
'groups' => array('business'),
)));
$metadata->addConstraint(new Assert\Callback(array(
'methods' => array('validAddress'),
'groups' => array('business'),
)));
}
public function validUser(ExecutionContextInterface $context)
{
$context->validate($this->user, 'user', $context->getGroup());
}
public function validAddress(ExecutionContextInterface $context)
{
$context->validate($this->address, 'address', $context->getGroup());
}
PS当然我的代码可以优化我也面临同样的问题(Symfony 3) 我有一个实体
UserInfo
,其中两个字段链接到一个实体Place
。
我需要在一种情况下验证两个字段,在另一种情况下验证一个字段
并且不想将约束移动到表单中
在第一个atemt中,我使用回调约束检查组并验证一个或两个字段。很好。但表单中的输入字段未标记为无效。所有错误都显示在表单顶部
然后我简单地创建了自己的验证器。由于这一点,我可以为每个字段指定所需的组。以及相应标记的表单中的所有无效输入字段
/**
* @Annotation
* @Target({"PROPERTY", "METHOD", "ANNOTATION"})
*/
class ValidGroupAware extends Constraint
{
}
class ValidGroupAwareValidator extends ConstraintValidator
{
/**
* Checks if the passed value is valid.
*
* @param mixed $value The value that should be validated
* @param Constraint $constraint The constraint for the validation
*/
public function validate($value, Constraint $constraint)
{
if (!$constraint instanceof ValidGroupAware) {
throw new UnexpectedTypeException($constraint, __NAMESPACE__.'\ValidGroupAware');
}
$violations = $this->context->getValidator()->validate($value, [new Valid()], [$this->context->getGroup()]);
/** @var ConstraintViolation[] $violations */
foreach ($violations as $violation) {
$this->context->buildViolation($violation->getMessage())
->setParameters($violation->getParameters())
->setCode($violation->getCode())
->setCause($violation->getCause())
->setPlural($violation->getPlural())
->setInvalidValue($violation->getInvalidValue())
->atPath($violation->getPropertyPath())
->addViolation();
}
}
}
杰出贡献!这解决了Symfony 2.8中的类似情况。非常感谢。如何将组与此代码一起使用?你能在你的回答中解释一下吗?可能是