Symfony验证器模块无法自动加载注释



我正在独立运行symfony/validator v3.4.4,并正在尝试验证对象,并且遇到了一个错误,即doctrine无法找到验证注释类。

我错过了什么?

use SymfonyComponentValidatorValidation;
use SymfonyComponentValidatorConstraints as Assert;
require_once('vendor/autoload.php');
$validator = Validation::createValidatorBuilder()
    ->enableAnnotationMapping()
    ->getValidator();

class Foo {
    /**
     * @AssertNotBlank()
     */
    public $userId;
    function __construct($userId) {
        $this->userId = $userId;
    }
}
class Bar {}
$foo = new Foo(1);
$bar = new Bar();
var_dump($validator->validate($bar));
/** 
 * =>
 * object(SymfonyComponentValidatorConstraintViolationList)#22 (1) {
 * ["violations":"SymfonyComponentValidatorConstraintViolationList":private]=>
 *  array(0) {
 * }
 * }
 */
var_dump($validator->validate($foo));
/**
 * =>
 * Fatal error: Uncaught exception
 * 'DoctrineCommonAnnotationsAnnotationException'
 * with message '[Semantical Error] The annotation
 * "@SymfonyComponentValidatorConstraintsNotBlank" in property Foo::$userId
 * does not exist, or could not be auto-loaded.' in
 * /home/readitla/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationException.php:54
 */

提前致谢

我之前在测试中遇到过同样的错误,我想通过实际的验证器而不是模拟。

可以通过调用class_exists(AssertNotBlank::class)来解决此问题:

<?php
use SymfonyComponentValidatorConstraints as Assert;
use SymfonyComponentValidatorValidation;
require_once __DIR__ . '/vendor/autoload.php';
class_exists(AssertNotBlank::class);
$validator = Validation::createValidatorBuilder()
    ->enableAnnotationMapping()
    ->getValidator();
class Foo
{
    /**
     * @AssertNotBlank()
     */
    public $id;
}
$foo = new Foo();
$foo->id = 123;
var_dump($validator->validate($foo));
/*
object(SymfonyComponentValidatorConstraintViolationList)#20 (1) {
  ["violations":"SymfonyComponentValidatorConstraintViolationList":private]=>
  array(0) {
  }
}
*/

我不确定为什么会发生这种情况,但由于某种原因,在自动加载器中注册类是不够的。注释似乎不会触发它们自动加载或类似的东西。

最新更新