Symfony:在自定义约束中添加标准约束

46qrfjad  于 2023-04-21  发布在  其他
关注(0)|答案(2)|浏览(113)

我尝试添加一个自定义约束,定义为defined in the official documentation,这是一个内置约束(例如Url)。
所以基本上,我已经在我的验证器类中添加了验证方法:

use Symfony\Component\Validator\Constraints\Url;
use Symfony\Component\Validator\Constraint;

public function validate($value, Constraint $constraint): void
{
    [...]
    $this->context
        ->getValidator()
        ->inContext($this->context)
        ->validate($value, new Url());
}

这在this article中似乎是可能的。
不幸的是,它不起作用。违规行为没有添加到约束的另一个。我别无选择,只能用不那么简洁的代码替换:

use Symfony\Component\Validator\Constraints\Url;
use Symfony\Component\Validator\Constraint;

public function validate($value, Constraint $constraint): void
{
    [...]
    $urlConstraint = new Url();
    $violations = $this->context
        ->getValidator()
        ->validate($value, $urlConstraint);

    if (count($violations) !== 0) {
        $this->context
            ->buildViolation($urlConstraint->message)
            ->addViolation();
}

有没有可能将标准约束包含到自定义约束中(当然不需要将约束直接添加到Entity类中)?

wljmcqd8

wljmcqd81#

在上面的例子中,我没有提到验证被放置在特定的验证组中。因此,标准约束没有被触发。需要将标准约束附加到默认组:

$this->context
    ->getValidator()
    ->inContext($this->context)
    ->validate($value, new Url(), Constraint::DEFAULT_GROUP);

Constraint::DEFAULT_GROUP等于'Default'。

gdrx4gfi

gdrx4gfi2#

我不能重现的问题(Symfony 6.2),所有的违规行为都添加.也许问题是别的东西.代码比较:

namespace App\Validator;

use Attribute;
use Symfony\Component\Validator\Constraint;

#[Attribute]
class MyConstraint extends Constraint
{
}
namespace App\Validator;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Constraints\Url;
use Symfony\Component\Validator\ConstraintValidator;

class MyConstraintValidator extends ConstraintValidator
{
    public function validate($value, Constraint $constraint)
    {
        $this->context
            ->buildViolation('Not valid.')
            ->addViolation();

        $this->context
            ->getValidator()
            ->inContext($this->context)
            ->validate($value, new Url());
    }
}
namespace App\Request;

use App\Validator\MyConstraint;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Constraints\Length;

class YourRequest
{
    #[Email]
    #[MyConstraint]
    #[Length(exactly: 2)]
    public string $value;
}

在这种情况下,将显示4个违规:电子邮件,“无效。”,URL,长度。

相关问题