Symfony 4 Пользовательское ограничение валидатора не загружается - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь создать собственный валидатор в моем проекте Symfony 4.4, описанном в https://symfony.com/doc/current/validation/custom_constraint.html

Я добавил следующие файлы:

src / Валидатор / Ограничения / 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 / Валидатор / Ограничения / 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();
        }
    }
}

config / validator / validation.yaml

App\Entity\AcmeEntity:
    properties:
        name:
            - NotBlank: ~
            - App\Validator\Constraints\ContainsAlphanumeric: ~

После того, как я попробовал вышеуказанное, валидатор не отвечает ... Итак, следующее, что я попробовал, это добавить ограничение валидатора для моего контактного лица.

src / Entity / Contact. php

<?php

namespace App\Entity;

use ApiPlatform\Core\Annotation\ApiResource;
use Doctrine\ORM\Mapping as ORM;

use App\Validator\Constraints as CustomAssert ;

/**
 * @ApiResource()
 * @ORM\Entity(repositoryClass="App\Repository\ContactRepository")
 */
class Contact
{

    .....


    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     * @CustomAssert\PhoneNumber
     */
    private $phoneNumber;

Это также не работает.

Кто-то, кто видит, что я делаю неправильно, или у меня есть предложение, что я могу попробовать? Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 12 марта 2020

Возможно ли, что искомое искомое ограничение установлено связанной организацией? если это так, то попробуйте передать проверку от первого объекта ко второму объекту.

Это можно сделать следующим образом:

@Assert\Valid()

не забудьте использовать его:

use Symfony\Component\Validator\Constraints as Assert; 

class Contact
{

    .....


    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     * @CustomAssert\PhoneNumber
     */
    private $phoneNumber;
    
    
    
class Person
{

    .....


    /**
     * @ORM\OneToOne(targetEntity="App\Entity\Contact")
     * @Assert\Valid()
     */
    private $contact;
0 голосов
/ 12 марта 2020

вы можете попытаться реализовать метод validateBy в вашем классе PhoneNumber. В обычных случаях вам не нужно этого делать, потому что поведение по умолчанию заключается в поиске того же имени ограничения с суффиксом Validator (которое будет PhoneNumberValidator).

Другая причина этого может быть вызовом validate метода ValidatorInterface. Может быть, вы проходите несколько групп проверки (если вы можете поделиться этой частью с нами здесь), и в этом случае вам нужно будет указать это в аннотации @CustomAssert\PhoneNumber(groups={"some_group"}).

...