Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在核心之外使用Symfony2验证程序注释_Symfony_Symfony Validator - Fatal编程技术网

在核心之外使用Symfony2验证程序注释

在核心之外使用Symfony2验证程序注释,symfony,symfony-validator,Symfony,Symfony Validator,如何配置Symfony2验证程序以使用核心之外的注释 在core中,您将执行以下操作: $container->loadFromExtension('framework', array( 'validation' => array( 'enable_annotations' => true, ), )); 摘自: 目前,为了使验证工作正常,规则是在loadValidatorMetadataClassMetadata$metadata方法中设置的,它可以工作,但

如何配置Symfony2验证程序以使用核心之外的注释

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

$container->loadFromExtension('framework', array(
  'validation' => array(
    'enable_annotations' => true,
  ),
));
摘自:

目前,为了使验证工作正常,规则是在loadValidatorMetadataClassMetadata$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 }}.',
        )));
    }    
}
然后,当它尝试自动加载注释时,会查找不存在的/vendor/symfony/validator/symfony/Component/validator/Constraints/Length.php。该文件实际上位于/vendor/symfony/validator/Constraints/Length.php

我可以创建一个registerLoader,但更愿意修复代码。在Symfony2内核中使用验证器时,该文件位置将是正确的


如何使其正确自动加载或让composer将Symfony2组件安装到与core相同的位置?

您需要使用AnnotationRegistry注册自动加载程序,因此无论何时需要供应商/自动加载,例如bootstrap.php,都需要添加registerLoader

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

\Doctrine\Common\Annotations\AnnotationRegistry::registerLoader([$loader, 'loadClass']);

事实证明,解决方案非常简单。

您需要使用AnnotationRegistry注册自动加载程序,因此无论何时需要供应商/自动加载,例如bootstrap.php,都需要添加registerLoader

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

\Doctrine\Common\Annotations\AnnotationRegistry::registerLoader([$loader, 'loadClass']);

事实证明,解决方案非常简单。

公认的答案提供了一个解决方案,但没有给出任何关于失败的解释

原因很简单。Doctrine\Common\Annotations\AnnotationRegistry提供的默认注释加载程序仅处理PSR-0命名空间,而Symfony\Component\Validator\Constraints是PSR-4命名空间。因此,加载程序无法加载该类。使用AnnotationRegistry::registerLoader方法注册composer auloader解决了这个问题,因为自动加载程序处理PSR-4名称空间


关于PSR-0和PSR-4的差异,您可以参考此问题了解更多详情:

接受的答案提供了一个解决方案,但没有给出任何关于故障的解释

原因很简单。Doctrine\Common\Annotations\AnnotationRegistry提供的默认注释加载程序仅处理PSR-0命名空间,而Symfony\Component\Validator\Constraints是PSR-4命名空间。因此,加载程序无法加载该类。使用AnnotationRegistry::registerLoader方法注册composer auloader解决了这个问题,因为自动加载程序处理PSR-4名称空间


关于PSR-0和PSR-4的区别,你可以参考这个问题来获得更多的细节:

我已经将Symfony\Validator集成到Nette\DI中,你可以。你看了吗,移到注释。请不要忘记下载条令/注释库等,它们是所需的依赖项。我已经将Symfony\Validator集成到Nette\DI中,您可以。您看过了吗,请转到注释。请不要忘记下载条令/注释库等,它们是必需的依赖项。由于我无意中发现了这个问题,我想补充一下,默认情况下,条令不会自动加载其自身库之外的任何注释。默认注释引擎指定一个文件,指示可以使用哪些注释,因此PSR-0或PSR-4实际上不存在问题。因为我偶然发现了这个问题,所以我想补充一下,默认情况下,该原则不会在自己的库之外自动加载任何注释。默认注释引擎指定一个文件,指示可以使用哪些注释,因此PSR-0或PSR-4实际上不存在问题。看见