2012-04-01 43 views
0

我在src/VNN/PressboxBundle/Component/Validator/CurrentPasswordValidator.php一個自定義的驗證:Symfony2的自定義的驗證標註不工作

<?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 \分量\驗證\約束\ CurrentPassword」 屬性VNN \ PressboxBundle \ Entity \ User :: $密碼不存在, 或無法自動加載。

我在做什麼錯?

回答

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; 
} 
+0

感謝您的想法。我檢查了「VNNPressboxBundle」已正確註冊。 – 2012-04-03 00:03:21

+0

@JasonSwett:用一些其他的可能性更新了我的答案。 – leek 2012-04-03 01:07:13