2013-08-23 3 views
1

저는 OhDateExtraValidatorBundle을 사용하고 있습니다. 내 Pull Request이 아직 받아 들여지지 않았기 때문에 로컬로 오버라이드해야합니다.Symfony2 : 번들의 유효성 검사기를 오버라이드합니다.

나는 the documentation을 읽었지만 유효성 검사기 제약 조건에 대해 작동하지 않을 수 있습니다. 여기

내가 무슨 짓을 :

  • 새로운 번들 (그래서 하나 개 이상의 통근 번들을 대체 할 수 있습니다) 등재, MyDateExtraValidatorBundle 라는
  • 추가 getParent() 방법 :

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

  • 원본 bundl과 동일한 경로로 작성했습니다. E :

    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도 있습니다.

해결 방법으로, 나는 자체 유효성 검사기를 만들 것입니다.

한국 전기/FooBundle/검사기/제약/MyDateExtra.php 여기

, 당신은 단지 메시지와 구성을 유지하기 위해, 기본 메타 데이터를 확장 할 수 있습니다.
@Annotationannotations을 통해 클래스를 호출 할 수 있습니다.

use Oh\DateExtraValidatorBundle\Validator\Constraints\DateExtra; 

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

한국 전기/FooBundle/검사기/제약/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 * "정상적인 방법"*이어야합니다.이 기능은 문서 링크에 명시된대로 아직 구현되지 않았습니다. * "진행 중"*. – Touki

+0

구현 된 것, 문서화 된 것 등은 무엇을 의미합니까? Btw 당신이보고 싶다면 [다른 문제] (http://stackoverflow.com/questions/18403366/symfony2-recursive-validation)가 있습니다! ;) – Bonswouar

관련 문제