我想知道您是否可以根据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();
}
}
}
有没有办法解决这个问题?
答案 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
函数中进行设置即可。