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->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.1无法识别在“ routes.php”文件上配置的路由?
无法使用 Symfony 5 安装 FOSRestBundle