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; } } }
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;
}