Пользовательская аннотация валидатора Symfony2 не работает - PullRequest
0 голосов
/ 02 апреля 2012

У меня есть собственный валидатор в 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 \Ограничения \ CurrentPassword "в свойстве VNN \ PressboxBundle \ Entity \ User :: $ пароль не существует или не может быть загружен автоматически.

Что я делаю не так?

1 Ответ

1 голос
/ 02 апреля 2012

Убедитесь, что 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...