Symfony 5 Не удается ввести EntityManagerInterface в валидатор - PullRequest
3 голосов
/ 14 апреля 2020

Я только что перешел на symfony 5 и сбит с толку! Я делал то же самое с валидаторами много раз с Symfony 4, но теперь внедрение зависимостей EntityManagerInterface в пользовательский валидатор вызывает такую ​​ошибку:

Слишком мало аргументов для функции App \ Validator \ Constraints \ UserUsernameConstraintValidator :: __ construct (), 0 передано в / var / www/appbaseV4/vendor/symfony/validator/ContainerConstraintValidatorFactory.php в строке 52 и ровно 1 ожидается

Класс валидатора выглядит следующим образом:

<?php

namespace App\Validator\Constraints;

use App\Entity\User;
use App\Repository\UserRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Form\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

class UserUsernameConstraintValidator extends ConstraintValidator
{

    /**
     * @var EntityManagerInterface
     */
    private $em;

    /**
     * UserEmailValidator constructor.
     * @param EntityManagerInterface $entityManager
     */
    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->em = $entityManager;

    }

    /**
     * @param mixed $value
     * @param Constraint $constraint
     */
    public function validate($value, Constraint $constraint) : void
    {


        if(!$constraint instanceof UserUsernameConstraint){
            throw new UnexpectedTypeException($constraint,UserUsernameConstraint::class);
        }

        if(null === $value || '' === $value){
            return;
        }

        if($value != $constraint->value){
            /** @var UserRepository $repo */
            $repo = $this->em->getRepository(User::class);

            if($repo->findOneBy(['username'=>$value])){
                $this->context->buildViolation($constraint->errorMessage)->setParameter('username',$value)->addViolation();
            }
        }

    }
}

И затем используя его в виде формы, как я всегда делаю:

$builder
            ->add('username',TextType::class,[
                'attr'=>[
                    'class'=>'form-control'
                ],
                'required'=>true,
                'constraints'=>[
                    new UserUsernameConstraint(),
                    new Length([
                        'min'=>6,
                        'max'=>20
                    ]),

                ]
            ])

Что здесь происходит? Они изменили это в Symfony 5, потому что он просто не вводит менеджер сущностей, как обычно, когда я использую symfony 4.

...