【发布时间】:2023-06-24 11:05:01
【问题描述】:
我想用约束注解验证一个对象,并在验证器上使用依赖项(entityManager)。
验证器不起作用,如果它在构造函数中有依赖项(例如 entityManager)。
我遵循了文档,但它不起作用: https://symfony.com/doc/current/validation/custom_constraint.html#constraint-validators-with-dependencies
"ClassNotFoundException 尝试从全局命名空间加载类“validator_question_exists”。 您是否忘记了“使用”声明?”
我尝试像这样验证“问题”对象(也许这就是问题所在):
$validator = Validation::createValidatorBuilder()
->enableAnnotationMapping()
->getValidator()
;
$question = new Question();
$errors = $validator->validate($question);
问题(要验证的对象)
/** @App\Validator\Constraint\Question\QuestionExists() */
class QuestionReadInput{
....
}
services.yaml
services:
validator.unique.question_exists:
class: App\Validator\Constraint\Question\QuestionExistsValidator
tags:
- { name: validator.constraint_validator, alias: validator_question_exists}
约束
namespace App\Validator\Constraint\Question;
use Symfony\Component\Validator\Constraint;
/**
* @Annotation
*/
class QuestionExists extends Constraint
{
public $message;
public function getTargets()
{
return self::CLASS_CONSTRAINT;
}
public function validatedBy()
{
//if i delete this function, symfony cant autowire the entitymanager to the validator
//this throws an error, wants to make a new validator_question_exists(), which not exists, because its a service alias, the docs said it should be okay
return 'validator_question_exists';
}
}
验证器
class QuestionExistsValidator extends ConstraintValidator
{
private $entityManager;
public function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
}
public function validate($value, Constraint $constraint)
{
die('I dont see this message...');
}
调试:容器
Information for Service "validator.unique.question_exists"
---------------- -------------------------------------------------------------------
Option Value
---------------- -------------------------------------------------------------------
Service ID validator.unique.question_exists
Class App\Validator\Constraint\Question\QuestionExistsValidator
Tags validator.constraint_validator (alias: validator_question_exists)
validator.constraint_validator
Public no
Synthetic no
Lazy no
Shared yes
Abstract no
Autowired yes
Autoconfigured yes
【问题讨论】:
-
我认为您的验证器标签应该是:
tags: ['validator.constraint_validator']并完成它。还要删除validatedBy,因为它会使用你别名的validator.constraint_validator,这根本没有任何意义。您本可以使用validator.unique.question_exists(适当的验证器),但删除它会导致类名被附加并查找Validator。如果它在同一个命名空间中,它应该可以工作。 -
更改了标签格式(但我认为没关系),尝试使用validatedBy return 'validator.unique.question_exists',得到与上面相同的'classNotFound exception'。是的,验证器位于同一个命名空间中,类名后附加了“验证器”。如果我删除了 validBy 类,仍然无法自动装配 entitymanager:“函数 App\Validator\Constraint\Question\QuestionExistsValidator::__construct() 的参数太少,0 传入 /var/www.../web/vendor/symfony /validator/ConstraintValidatorFactory.php 位于第 43 行,预期正好为 1"
-
您能解释一下为什么您自己创建
Validator实例而不是使用Symfony 提供的validator服务吗? -
正如 xabbuh 所说,自己构建验证器可能会产生错误,
validatedBy方法显然必须返回验证器的 类名,而不是服务描述符。
标签: php symfony validation symfony4 symfony-3.4