猿问

Symfony 4 自定义验证器约束未加载

我正在尝试在https://symfony.com/doc/current/validation/custom_constraint.html中描述的 Symfony 4.4 项目中创建自定义验证器


我添加了下一个文件:


src/Validator/Constraints/PhoneNumber.php


<?php


namespace App\Validator\Constraints;


use Symfony\Component\Validator\Constraint;


/**

 * @Annotation

 */

class PhoneNumber extends Constraint

{

    public $message = 'The string contains an illegal character: it can only contain letters or numbers.';

}

src/Validator/Constraints/PhoneNumberValidator.php

namespace App\Validator\Constraints;


use Symfony\Component\Validator\Constraint;

use Symfony\Component\Validator\ConstraintValidator;

use Symfony\Component\Validator\Exception\UnexpectedTypeException;

use Symfony\Component\Validator\Exception\UnexpectedValueException;


class PhoneNumberValidator extends ConstraintValidator

{

    public function validate($value, Constraint $constraint)

    {

        dd('er wordt gevalideerd!');


        if (!$constraint instanceof PhoneNumber) {

            throw new UnexpectedTypeException($constraint, PhoneNumber::class);

        }


        // custom constraints should ignore null and empty values to allow

        // other constraints (NotBlank, NotNull, etc.) take care of that

        if (null === $value || '' === $value) {

            return;

        }


        if (!is_string($value)) {

            // throw this exception if your validator cannot handle the passed type so that it can be marked as invalid

            throw new UnexpectedValueException($value, 'string');


            // separate multiple types using pipes

            // throw new UnexpectedValueException($value, 'string|int');

        }


        if (!preg_match('/^[a-zA-Z0-9]+$/', $value, $matches)) {

            // the argument must be a string or an object implementing __toString()

            $this->context->buildViolation($constraint->message)

                ->setParameter('{{ string }}', $value)

                ->addViolation();

        }

    }

}


在我尝试了上述方法之后,验证器没有响应......所以接下来我尝试将验证器约束添加到我的实体联系人中。


这也行不通。


有人看到我做错了什么或对我可以尝试什么有建议?提前致谢!


繁星淼淼
浏览 128回答 2
2回答

BIG阳

您正在寻找的约束是否可能是从相关实体中设置的?如果是这样,则尝试将验证从第一个实体传递到第二个实体。这可以通过以下方式完成:@Assert\Valid()不要忘记使用它:use Symfony\Component\Validator\Constraints as Assert;&nbsp;class Contact{&nbsp; &nbsp; .....&nbsp; &nbsp; /**&nbsp; &nbsp; &nbsp;* @ORM\Column(type="string", length=255, nullable=true)&nbsp; &nbsp; &nbsp;* @CustomAssert\PhoneNumber&nbsp; &nbsp; &nbsp;*/&nbsp; &nbsp; private $phoneNumber;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;class Person{&nbsp; &nbsp; .....&nbsp; &nbsp; /**&nbsp; &nbsp; &nbsp;* @ORM\OneToOne(targetEntity="App\Entity\Contact")&nbsp; &nbsp; &nbsp;* @Assert\Valid()&nbsp; &nbsp; &nbsp;*/&nbsp; &nbsp; private $contact;

幕布斯6054654

您可以尝试 在您的类中实现该validateBy方法。PhoneNumber在正常情况下,您不需要这样做,因为默认行为是查找以Validator( 将是PhoneNumberValidator) 为后缀的相同约束名称。另一个原因可能是validate调用ValidatorInterface.&nbsp;也许您正在传递一些验证组(如果您可以在此处与我们分享该部分),在这种情况下,您需要在注释中指定@CustomAssert\PhoneNumber(groups={"some_group"})。
随时随地看视频慕课网APP
我要回答