2013-08-23 39 views
1

我使用的是OhDateExtraValidatorBundle,並且因爲我的Pull Request尚未被接受,所以我需要在本地覆蓋它。Symfony2:覆蓋套件的驗證器

我讀the documentation,但不能使它適用於驗證器約束。

這裏是我做過什麼:

  • 創建一個新的軟件包(這樣我就可以覆蓋一個以上的extern束),稱爲MyDateExtraValidatorBundle
  • 添加了getParent()方法:

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

  • 寫入修改的路徑與原始的bundles相同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

在這裏,你只需擴展基元數據,以保持信息和配置。
@Annotation允許類通過annotations調用。

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

謝謝,這正是我所需要的,在添加命名空間後完美地工作! 想到了,爲什麼它不能成爲重寫bundle Validator的「正常」方式呢?它漂亮乾淨,不需要大量的代碼行。 – Bonswouar

+0

@Bonswouar它應該是*「普通方式」*,該功能尚未實現,如文檔鏈接所示:*「進行中」*。 – Touki

+0

你是什麼意思的實施,如記錄? 順便說一句我有[另一個問題](http://stackoverflow.com/questions/18403366/symfony2-recursive-validation)如果你想看看! ;) – Bonswouar