Я только что перешел на 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.