在Core之外使用Symfony2 Validator注释

loo*_*ers 1 symfony symfony-validator

如何配置Symfony2 Validator以使用Core之外的注释?

在核心中,您将执行以下操作:

$container->loadFromExtension('framework', array(
  'validation' => array(
    'enable_annotations' => true,
  ),
));
Run Code Online (Sandbox Code Playgroud)

摘自:http://symfony.com/doc/2.0/book/validation.html#configuration

现在要进行验证工作,规则是在方法loadValidatorMetadata(ClassMetadata $ metadata)中设置的,它可以工作,但我更喜欢注释.

示例具有验证注释的实体和用于设置验证规则的备用php方法:

<?php

namespace Foo\BarBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints as Assert;


/**
 * @ORM\Entity(repositoryClass="Foo\BarBundle\Entity\Repository\FooRepository")
 * @ORM\Table(name="foo")
 */
class Foo {


    /**
     * @ORM\Column(type="integer", name="bar")
     * @Assert\Type(
     *     type="integer",
     *     message="The value {{ value }} is not a valid {{ type }}."
     * )
     */
    protected $bar;


    public static function loadValidatorMetadata(ClassMetadata $metadata)
    {
        $metadata->addPropertyConstraint('bar', new Assert\Type(array(
            'type'    => 'integer',
            'message' => 'The value {{ value }} is not a valid {{ type }}.',
        )));
    }    
}
Run Code Online (Sandbox Code Playgroud)

更新1

现在的问题似乎是注释没有正确自动加载.

我将注释加载到命名空间中:

\Doctrine\Common\Annotations\AnnotationRegistry
::registerAutoloadNamespace("Symfony\Component\Validator\Constraints\\", __DIR__.'/vendor/symfony/validator');
Run Code Online (Sandbox Code Playgroud)

然后,当它尝试自动加载注释时,它会查找/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Length.php哪些不存在.该文件实际位于/vendor/symfony/validator/Constraints/Length.php

我可以创建一个registerLoader()但宁可修复代码.在Symfony2 Core中使用Validator时,文件位置是正确的.

如何正确地自动加载或让作曲家将Symfony2组件安装到与核心相同的位置?

loo*_*ers 5

您需要使用AnnotationRegistry注册Autoloader,因此您需要供应商/自动加载,例如bootstrap.php添加registerLoader().

//Composer libraries
$loader = require_once 'vendor/autoload.php';

\Doctrine\Common\Annotations\AnnotationRegistry::registerLoader([$loader, 'loadClass']);
Run Code Online (Sandbox Code Playgroud)

事实证明解决方案非常直截了当.