【问题标题】:Symfony2 custom validator annotation not workingSymfony2 自定义验证器注释不起作用
【发布时间】:2012-04-01 20:11:07
【问题描述】:

我在src/VNN/PressboxBundle/Component/Validator/CurrentPasswordValidator.php 中有一个自定义验证器:

<?php
namespace VNN\PressboxBundle\Component\Validator\Constraints;

use Symfony\Component\Validator\ConstraintValidator,
    Symfony\Component\Validator\Constraint,
    Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface,
    Symfony\Component\Security\Core\SecurityContextInterface,
    JMS\DiExtraBundle\Annotation\Validator,
    JMS\DiExtraBundle\Annotation\InjectParams,
    JMS\DiExtraBundle\Annotation\Inject;

/**
 * @Validator("user.validator.current_password")
 */
class CurrentPasswordValidator extends ConstraintValidator
{
    // ...
}

然后我在src/VNN/PressboxBundle/Component/Validator/Contraints/CurrentPassword.php

<?php
namespace VNN\PressboxBundle\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 */
class CurrentPassword extends Constraint
{
    public $message = "Your current password is not valid";

    /** 
     * @return string
     */
    public function validatedBy()
    {   
        return 'user.validator.current_password';
    }   
}

由于某种原因,当我尝试添加使用此验证器的注释时,我收到错误消息。这是我的实体/注释:

<?php

namespace VNN\PressboxBundle\Entity;

use Symfony\Component\Security\Core\User\UserInterface;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\Mapping\JoinTable as JoinTable;
use Doctrine\ORM\Mapping\JoinColumn as JoinColumn;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\ExecutionContext;
use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\MaxLength;
use Symfony\Component\Validator\Constraints\Email;
use VNN\PressboxBundle\Component\Validator\Constraints\CurrentPassword;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * VNN\PressboxBundle\Entity\User
 *
 * @ORM\Table(name="user")
 * @ORM\Entity
 */
class User implements UserInterface, \Serializable
{

    /**
     * @var string $password
     * @Assert\NotBlank()
     * @CurrentPassword()
     *
     * @ORM\Column(name="password", type="string", length=255)
     */
    private $password;
}

我得到的错误是:

AnnotationException: [语义错误] 注释 “@VNN\PressboxBundle\Component\Validator\Constraints\CurrentPassword” 在属性 VNN\PressboxBundle\Entity\User::$password 中不存在, 或无法自动加载。

我做错了什么?

【问题讨论】:

    标签: symfony


    【解决方案1】:

    检查VNN\PressboxBundle\VNNPressboxBundle() 是否在AppKernel.php 中的内核中正确注册。

    更新:如果已正确注册,并且 src/ 已注册为自动加载器的后备(假设 VNN/src/ 下),您可能需要尝试加载手动为自己服务并在失败时检查堆栈跟踪:

    $validator = $container->get('user.validator.current_password');
    // Pretending this is a unit test:
    // $this->assertInstanceOf('VNN\PressboxBundle\Component\Validator\Constraints\CurrentPasswordValidator', $validator);
    

    另外,请确保您已清除缓存(如果不在dev 环境中测试)。


    旁注(但与您的问题无关) - 如果您开始添加更多验证器,使用此语法会更有用:

    <?php
    
    namespace VNN\PressboxBundle\Entity;
    
    use VNN\PressboxBundle\Component\Validator\Constraints as VNN;
    
    class User implements UserInterface, \Serializable
    {
        /**
         * @VNN\CurrentPassword
         */
        private $password;
    }
    

    【讨论】:

    • 感谢您的想法。我检查了VNNPressboxBundle 已正确注册。
    • @JasonSwett:用其他一些可能性更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多