除非指定的组,否则我需要以symfony2形式级联验证。
这里symfony团队告诉有效约束不支持组选项 https://github.com/symfony/symfony/issues/4893
怎么做?
详细说明:
我有一个User Entity具有address属性,它是Address Entity的外键。此外,我有实体称为业务具有用户作为属性和地址属性。我需要验证用户的地址,但是,如果用户是Business的属性,则不进行验证...
模式
Class Address {
...
}
Class User {
/**
* @Assert\Valid(groups={"user"})
*/
private $address;
}
Class Business {
/**
* @Assert\Valid(groups={"business"})
*/
private $user;
/**
* @Assert\Valid(groups={"business"})
*/
private $address;
}
所以我需要验证用户表单中的地址仅用于用户表单,而不是用于业务。
谢谢
答案 0 :(得分:6)
我遇到了同样的问题(Symfony 3)。
我有一个实体UserInfo
,其中两个字段链接到一个实体Place
。
我需要在一个案例中验证两个字段,在另一个案例中验证一个字段。
并且不想将约束移动到Form中。
在第一个问题中,我使用了一个Callback约束来检查组并验证一个或两个字段。很好。但表单中的输入字段未标记为无效。所有错误都显示在表单的顶部。
然后我只是创建了自己的验证器。多亏了这一点,我可以为每个字段指定所需的组。并且相应地标记了表单中的所有无效输入字段。
/**
* @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();
}
}
}
答案 1 :(得分:4)
好的,我有一个解决方案。回调约束确实有'组'选项,我们可以在这里使用它。在回调中,我们将调用所需实体的验证。
我将使用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());
}
PS当然我的代码可以优化
答案 2 :(得分:0)
您可以在User FormType中添加验证规则。 别忘了删除你的注释。
Follow this link to learn more about validation in form type