在核心之外使用 Symfony2 验证器注解
Use Symfony2 Validator Annotations outside of Core
如何配置 Symfony2 验证器以在核心之外使用注释?
在核心中,您将执行以下操作:
$container->loadFromExtension('framework', array(
'validation' => array(
'enable_annotations' => true,
),
));
取自: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 }}.',
)));
}
}
更新 1
现在的问题似乎是注释未正确自动加载。
我将注释加载到命名空间中:
\Doctrine\Common\Annotations\AnnotationRegistry
::registerAutoloadNamespace("Symfony\Component\Validator\Constraints\", __DIR__.'/vendor/symfony/validator');
然后,当它尝试自动加载注释时,它会查找 /vendor/symfony/validator/Symfony/Component/Validator/Constraints/Length.php
不存在的注释。该文件实际上位于 /vendor/symfony/validator/Constraints/Length.php
我可以创建一个 registerLoader()
但宁愿修复代码。在 Symfony2 Core 中使用 Validator 时,该文件位置是正确的。
如何使其正确自动加载或让作曲家将 Symfony2 组件安装到与核心相同的位置?
您需要使用 AnnotationRegistry 注册 Autoloader,因此无论何时您需要 vendor/autoload,例如 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 命名空间。因此,加载程序无法加载 class。使用 AnnotationRegistry::registerLoader 方法注册 composer auloader 可以解决问题,因为该自动加载器处理 PSR-4 命名空间。
你可以参考这个问题来了解更多关于 PSR-0 和 PSR-4 差异的细节:What is the difference between PSR-0 and PSR-4?
如何配置 Symfony2 验证器以在核心之外使用注释?
在核心中,您将执行以下操作:
$container->loadFromExtension('framework', array(
'validation' => array(
'enable_annotations' => true,
),
));
取自: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 }}.',
)));
}
}
更新 1
现在的问题似乎是注释未正确自动加载。
我将注释加载到命名空间中:
\Doctrine\Common\Annotations\AnnotationRegistry
::registerAutoloadNamespace("Symfony\Component\Validator\Constraints\", __DIR__.'/vendor/symfony/validator');
然后,当它尝试自动加载注释时,它会查找 /vendor/symfony/validator/Symfony/Component/Validator/Constraints/Length.php
不存在的注释。该文件实际上位于 /vendor/symfony/validator/Constraints/Length.php
我可以创建一个 registerLoader()
但宁愿修复代码。在 Symfony2 Core 中使用 Validator 时,该文件位置是正确的。
如何使其正确自动加载或让作曲家将 Symfony2 组件安装到与核心相同的位置?
您需要使用 AnnotationRegistry 注册 Autoloader,因此无论何时您需要 vendor/autoload,例如 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 命名空间。因此,加载程序无法加载 class。使用 AnnotationRegistry::registerLoader 方法注册 composer auloader 可以解决问题,因为该自动加载器处理 PSR-4 命名空间。
你可以参考这个问题来了解更多关于 PSR-0 和 PSR-4 差异的细节:What is the difference between PSR-0 and PSR-4?