根据其值URL symfony验证字段

时间:2018-07-28 20:35:11

标签: symfony validation constraints

我想知道您是否可以根据Symfony中表单中的值验证字段? 例如,我在与之关联的表单中有一个URL和一个名称。假设该名称的值为'instagram',则我希望该URL由类Instagram Validator等进行验证。我写了一个开关,但出现错误:

在null上调用成员函数buildViolation()

我尝试过的事情:

public function validateURL($url, $name)
{
    $message = '';
    switch ($name) {
        case "Instagram":
            $instagramValidator = new InstagramValidator();
            $instagramValidator->validate($url, new Url());

            break;
        default:
            return;
    }

    return $message;
}

InstagramValidator:

class InstagramValidator extends ConstraintValidator
{
/**
 * {@inheritdoc}
 */
public function validate($url, Constraint $constraint)
{
    if (!preg_match('/(?:http:\/\/)?(?:www\.)?instagram\.com\/(?:(?:\w)*#!\/)?(?:pages\/)?(?:[\w\-]*\/)*([\w\-]*)/', $url)) {
        $this->context->buildViolation($constraint->message)
            ->setParameter('{{ value }}', $this->formatValue($url))
            ->addViolation();
    }
  }
}

有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:0)

出现此错误是因为您没有将$context传递给验证者的构造函数。 创建自己的约束并通过Validation::createValidator()->validate()使用它:

use Symfony\Component\Validator\Constraints\Regex;

class Instagram extends Regex
{
    public function __construct()
    {
        parent::__construct(['pattern' => '/your regex/']);
    }

    public function validatedBy(): string
    {
        return Regex::class . 'Validator';
    }
}

现在您可以使用它:

$violations = Validation::createValidator()->validate($url, new Instagram());

此外,您可以使用自己的验证器,只需在约束的validatedBy函数中进行设置即可。