2

カスタム バリデータの制約に問題があります。エンティティ TicketCode のフィールド コードを検証したいと考えています。

しかし、if(form->isValid) を使用するとバリデーターが呼び出されません。その理由がわかりません。

私のカスタム Validator は、このコードが対応しているかどうかを DataBase でチェックするエンティティ マネージャを必要とします。対応していない場合、バリデータはメッセージ エラーを送信します。

私のエンティティ

     <?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;
    }
}

最後に、バンドル内の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 }

私のバリデーターが呼び出されない理由がわかっている場合は、説明してください。

4

1 に答える 1

1

関数名ValidatedBy()に上部の V があります。validatedBy()であるはずです。

于 2012-07-10T15:11:44.200 に答える