我正在使用OhDateExtraValidatorBundle,因为我的Pull Request尚未被接受,我需要在本地覆盖它。
我读过the documentation但无法使其适用于验证器约束。
这是我做的:
添加了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.
什么是正确的方法?
答案 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;
}