Symfony2:覆盖捆绑包的验证程序

Symfony2:覆盖捆绑包的验证程序,symfony,inheritance,overriding,bundle,validation,Symfony,Inheritance,Overriding,Bundle,Validation,我正在使用,因为我的还没有被接受,我需要在本地覆盖它 我阅读了,但无法使其适用于验证器约束 以下是我所做的: 创建了一个名为MyDateExtraValidatorBundle的新捆绑包(因此我可以覆盖多个外部捆绑包) 添加了getParent()方法: 公共函数getParent() { 返回“OhDateExtraValidatorBundle”; } 在与原始捆绑包相同的路径中写入我的修改: namespace MYVENDOR\MyDateExtraValidatorBundle\

我正在使用,因为我的还没有被接受,我需要在本地覆盖它

我阅读了,但无法使其适用于验证器约束

以下是我所做的:

  • 创建了一个名为MyDateExtraValidatorBundle的新捆绑包(因此我可以覆盖多个外部捆绑包)
  • 添加了
    getParent()
    方法:

    
    公共函数getParent()
    {
    返回“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;
        } 
      }
    }
    
但它从未加载

我还尝试在entity(带有自定义验证器)类中直接使用包的名称,但也不起作用

use MYVENDOR\MyDateExtraValidatorBundle\Validator\Constraints as OhAssert;
=>

正确的方法是什么?

当前不允许覆盖。
在这个问题上也有一个新的观点

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

Acme/FooBundle/Validator/Constraints/MyDateExtra.php

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

Acme/FooBundle/Validator/Constraints/mydateextralvalidator.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;
}

谢谢,这正是我所需要的,在添加名称空间后效果非常好!我想,为什么这不是覆盖捆绑验证程序的“正常”方式呢?它非常干净,不需要太多的代码行@Bonswouar这应该是“正常的方式”,正如文档链接“进行中”所示,此功能尚未实现。您所说的实现是什么意思,比如文档化?顺便说一句,如果你想看的话,我已经准备好了!;)@Bonswouar这意味着他们将来应该开发(并记录)这种功能性(覆盖验证元数据)。
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;
}