Symfony2:覆盖Bundle的Validator

时间:2013-08-23 09:28:40

标签: symfony inheritance override bundle validation

我正在使用OhDateExtraValidatorBundle,因为我的Pull Request尚未被接受,我需要在本地覆盖它。

我读过the documentation但无法使其适用于验证器约束。

这是我做的:

  • 创建了一个新的Bundle(所以我可以覆盖多个extern包),名为 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. 

什么是正确的方法?

1 个答案:

答案 0 :(得分:2)

Bundle inheritance目前不允许覆盖validation metadata 此主题还有一个pending issue

作为一种解决方法,我会创建自己的验证器。

的Acme / FooBundle /验证/约束/ MyDateExtra.php

在这里,您只需扩展基本元数据,以保留消息和配置 @Annotation允许通过annotations 调用您的课程。

use Oh\DateExtraValidatorBundle\Validator\Constraints\DateExtra;

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

的Acme / 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;
}