2013-08-23 5 views
1

Я использую OhDateExtraValidatorBundle, а потому, что мой Pull Request еще не принят. Мне нужно будет его локализовать.Symfony2: переопределить валидатор пакета

Я читал the documentation, но не смог заставить его работать для ограничения валидатора.

Вот что я сделал:

  • Создано новый Bundle (так что я могу переопределить более одного Экстерн узелок), называется MyDateExtraValidatorBundle
  • Добавлен getParent() метод:

    public function getParent() { return 'OhDateExtraValidatorBundle'; }

  • Написал мою модификацию по тому же пути, что и исходный комплект е:

    namespace MYVENDOR\MyDateExtraValidatorBundle\Validator\Constraints; 
    
    use Oh\DateExtraValidatorBundle\Validator\Constraints\DateExtraValidator as ConstraintValidator; 
    
    class DateExtraValidator extends ConstraintValidator 
    { 
        public function validate($value, Constraint $constraint) 
        { 
        parent::validate($value, Constraint $constraint); 
    
        if (null === $value || '' === $value){ 
         return; 
        } 
    
    
        if(is_object($value) && method_exists($value, '__toString')) { 
         $value = (string) $value; 
        } 
        if (!$dateTime->getTimestamp()) 
        { 
         $this->context->addViolation($constraint->invalidMessage); 
         return; 
        } 
        } 
    } 
    

Но он никогда не загружен.

Я также попытался использовать прямое имя моего пакета в сущности (с помощью специального валидатора), но не работает.

use MYVENDOR\MyDateExtraValidatorBundle\Validator\Constraints as OhAssert; 

=>

The annotation "@MYVENDOR\MyDateExtraValidatorBundle\Validator\Constraints\DateExtra" [...] does not exist, or could not be auto-loaded. 

Что правильно делать?

ответ

2

Bundle inheritance в настоящее время не позволяет переопределять validation metadata.
Существует также pending issue на эту тему.

В качестве обходного пути я бы создал свой собственный валидатор.

Acme/FooBundle/Validator/Ограничения/MyDateExtra.php

Здесь, вы просто расширить базу метаданных, чтобы сохранить сообщения и конфигурации.
@Annotation Позволяет вызывать ваш класс через annotations.

use Oh\DateExtraValidatorBundle\Validator\Constraints\DateExtra; 

/** 
* @Annotation 
*/ 
class MyDateExtra extends DateExtra 
{ 
} 

Acme/FooBundle/Validator/Ограничения/MyDateExtraValidator.php

Здесь вы расширяете поведение базового валидатора с собственной логикой.

use Oh\DateExtraValidatorBundle\Validator\Constraints\DateExtraValidator; 

class MyDateExtraValidator extends DateExtraValidator 
{ 
    public function validate($value, Constraint $constraint) 
    { 
     parent::validate($value, Constraint $constraint); 

     if (null === $value || '' === $value) { 
      return; 
     } 

     if(is_object($value) && method_exists($value, '__toString')) { 
      $value = (string) $value; 
     } 

     if (!$dateTime->getTimestamp()) { 
      $this->context->addViolation($constraint->invalidMessage); 
     } 
    } 
} 

Теперь вы должны использовать его в своей модели.

use Acme\FooBundle\Validator\Constraints as Extra; 

class Foo 
{ 
    /** 
    * @Extra\MyDateExtra 
    */ 
    protected $time; 
} 
+0

Спасибо, это именно то, что мне нужно, отлично работает после добавления пространств имен! Мысль, почему он не может быть «нормальным» способом переопределить проверки валидатора? Это очень чисто и не нужно много строк кода.! – Bonswouar

+0

@Bonswouar Это должен быть «обычный способ» *, эта функциональность еще не реализована, как указано в ссылках на документацию: * «In progress» *. – Touki

+0

Что вы подразумеваете под реализацией, как документально? Btw У меня есть [еще одна проблема] (http://stackoverflow.com/questions/18403366/symfony2-recursive-validation), если вы хотите взглянуть! ;) – Bonswouar

Смежные вопросы