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 }
如果您有任何想法,爲什麼我的驗證器從未被調用過,請向我解釋謝謝。
嘗試在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