【问题标题】:Validate field depending on its value url symfony根据其值 url 验证字段 symfony
【发布时间】:2018-07-28 20:35:11
【问题描述】:

我想知道您是否可以根据 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;
}

Instagram验证器:

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();
    }
  }
}

那么有办法解决这个问题吗?

【问题讨论】:

    标签: symfony validation constraints


    【解决方案1】:

    您收到此错误是因为您没有将$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 函数中。

    【讨论】:

    • 谢谢你的回答,我会检查一下。
    猜你喜欢
    • 1970-01-01
    • 2019-07-11
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多