1

我正在使用OhDateExtraValidatorBundle,因为我的拉取请求尚未被接受,我需要在本地覆盖它。

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

这是我所做的:

  • 创建了一个名为MyDateExtraValidatorBundle的新 Bundle(因此我可以覆盖多个外部包)
  • 添加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. 

正确的做法是什么?

4

1 回答 1

2

Bundle 继承目前不允许覆盖验证元数据
在这个主题上还有一个悬而未决的问题

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

Acme/FooBundle/Validator/Constraints/MyDateExtra.php

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

use Oh\DateExtraValidatorBundle\Validator\Constraints\DateExtra;

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

Acme/FooBundle/Validator/Constraints/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;
}
于 2013-08-23T10:23:59.037 回答