2012-07-06 29 views
2

我有一些自定義驗證器約束的問題。我想驗證實體TicketCode中的字段代碼。自定義驗證器不在Symfony 2中調用

但是當我使用if(form-> isValid)時,不會調用驗證器,我不明白爲什麼。

我的自定義驗證器需要實體管理器與數據庫進行檢查,如果此代碼對應,否則驗證器將發送消息錯誤。

我的實體

 <?php 

namespace My\MyBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Validator\Constraints as Assert; 
use My\MyBundle\Validator as TicketAssert; 


/** 
* My\MyBundle\Entity\TicketCode 
* 
* @ORM\Table() 
* @ORM\Entity(repositoryClass="My\MyBundle\Entity\TicketCodeRepository") 
*/ 
class TicketCode 
{ 
    /** 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string $code 
    * 
    * @ORM\Column(name="code", type="string", length=255) 
    * @TicketAssert:ValidCode(entity="TicketBundle:TicketCode", property="code") 
    */ 
    protected $code; 
} 

我的類約束

<?php 

namespace My\MyBundle\Validator; 

use Symfony\Component\Validator\Constraint; 

/** 
* @Annotation 
*/ 

class ValidCode extends Constraint 
{ 
    public $message = 'Code Invalide'; 
    public $entity; 
    public $property; 

    public function ValidatedBy() 
    { 
     return 'my_ticket_validator'; 
    } 

    public function requiredOptions() 
    { 
     return array('entity', 'property'); 
    } 

    public function targets() 
    { 
     return self::CLASS_CONSTRAINT; 
    } 
} 

我的驗證

<?php 

namespace My\MyBundle\Validator; 

use Doctrine\ORM\EntityManager; 
use Symfony\Component\Validator\Constraint; 
use Symfony\Component\Validator\ConstraintValidator; 


class ValidCodeValidator extends ConstraintValidator 
{ 

    private $entityManager; 

    public function __construct(EntityManager $entityManager) 
    { 
     $this->entityManager = $entityManager; 
    } 

    public function isValid($value, Constraint $constraint) 
    { 
     $todayInObject = new \DateTime(); //Renvoit la date du jour 
     var_dump($todayInObject); 

     $ticketCode = $this->entityManager->getRepository('MyMyBundle:TicketCode')->findOneBy(array('code' => $constraint->property)); 

     if ($ticketCode != null) { 

      if ($ticketCode->nbMaxUse != 0 && ($todayInObject >= $ticketCode->getDateBegin && $todayInObject <= $ticketCode->getDateEnd())) { 

       return true; 
      } 
      else { 
       $this->setMessage($constraint->message); 
       return false; 
      } 
     } 
     else { 
      $this->setMessage($constraint->message); 
      return false; 
     } 

     return false; 
    } 
} 

Finall y我的service.yml在我的包中。

parameters: 

    my_ticket.validator.validcode.class:  My\MyBundle\Validator\ValideCodeValidator 

services: 

    my_ticket.validator.validcode: 
     class:  %my_ticket.validator.validcode.class% 
     arguments: [@doctrine.orm.entity_manager] 
     tags: 
      - { name: validator.constraint_validator, alias: my_ticket_validator } 

如果您有任何想法,爲什麼我的驗證器從未被調用過,請向我解釋謝謝。

+0

嘗試在app/config/config.yml中放置service.yml文件的內容。如果這個工作,這意味着你沒有從你的包的DI擴展文件中加載service.yml(參見如何操作:http://symfony.com/doc/current/cookbook/bundles/extension.html) 也,您是否嘗試在實體註釋中用「@TicketAssert \ ValidCode」替換「@TicketAssert:ValidCode」? – AdrienBrault 2012-07-07 10:35:24

回答

1

您的函數名稱中有上限V ValidatedBy()。它應該是validatedBy()

+0

對我來說同樣的情況 - 沒有調用,但「v」是小寫 - validatedBy() – 2015-07-02 11:43:26