Symfony 5 无法将 EntityManagerInterface 注入验证器

Posted

技术标签:

【中文标题】Symfony 5 无法将 EntityManagerInterface 注入验证器【英文标题】:Symfony 5 Can't Inject EntityManagerInterface Into Validator 【发布时间】:2020-07-27 07:10:17 【问题描述】:

我刚刚搬到 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 时那样注入实体管理器。

【问题讨论】:

听起来容器不知道您的验证器 - line 52 in the source 是 $container-&gt;has(...) 返回 false 的代码路径。您可能需要调整服务配置 - 我认为默认情况下会选择 ConstraintValidators,但您的设置可能略有不同 @iainn 这就是我的意思,它们通常被默认选中,一直在 symfony 4 中,根据他们的 5 个文档,它仍然应该是因为我使用默认的 services.yaml 配置 我在一个新的 S5 项目中做了一个快速测试用例,您的约束按预期工作。您的升级过程中有问题。也许尝试:“bin/console debug:container UserUsernameConstraintValidator”并验证您是否定义了服务。 清除缓存? 从表面上看,Symfony 并没有正确选择你的验证器。我敢打赌它会自动装配。你确定它不排除验证器吗?你也有验证器的相应约束文件吗?就像有人在这里提到的那样,运行debug: container 会很好。我 100% 确定 Symfony 5 应该会自动选择它,因为它可以与我的验证器一起使用。还要检查拼写错误。 【参考方案1】:

您似乎没有使用default services.yaml configuration,在这种情况下,您必须使用validator.constraint_validator 标签来tag 约束验证器。检查documentation for Constraint Validators with Dependencies 或在config/services.yaml 中修复/更新您的Automatic Service Loading。

【讨论】:

以上是关于Symfony 5 无法将 EntityManagerInterface 注入验证器的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 symfony 5 安装奏鸣曲管理员

为什么Symfony 5.1无法识别在“ routes.php”文件上配置的路由?

无法使用 Symfony 5 安装 FOSRestBundle

我无法使用 symfony 5 安装 sonataAdminBundle

[Symfony 5]注销后的确认信息

无法使用 Encore 在 Symfony 5.3 上正确安装和使用引导程序