我按照Symfony2食谱中的步骤创建了一个自定义电话约束。
约束类:
namespace Foo\Bundle\StackBundle\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
/**
* @Annotation
*/
class Phone extends Constraint
{
public $message = 'The Phone contains an illegal character';
}
验证器类:
namespace Foo\Bundle\StackBundle\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
/**
* @Annotation
*/
class PhoneValidator extends ConstraintValidator
{
public function validate($value, Constraint $constraint)
{
$length = strlen($value);
if (is_null($value)) {
return;
}
if ( $length > 14 || ! preg_match("/\([1-9]{2}\) [0-9]{4}-[0-9]{4}/", $value)) {
$this->context->addViolation($constraint->message, array(), $value);
}
}
}
这个验证器工作正常,但是我想使用Symfony2提供的Regex字符串约束。
我试图在约束类中实现这一点:
namespace Foo\Bundle\StackBundle\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @Annotation
*/
class Phone extends Constraint
{
public $message = 'The Phone contains an illegal character';
public static function loadValidatorMetadata(ClassMetadata $metadata)
{
$metadata->addPropertyConstraint('description', new Assert\Regex(array(
'pattern' => '/\([1-9]{2}\) [0-9]{4}-[0-9]{4}/'
)));
}
}
但它给了我一个致命的错误,要求我实现valate方法:
致命错误:Class Foo\Bundle\StackBundle\Validator\Constraint\CepValidator包含1个抽象方法,因此必须声明为抽象或实现剩余的方法(Symfony\Component\Validator\ConstraintValidatorIntercface::验证)
但是验证方法已经在ConstraintValidator类中实现了(尽管如果正确实现,我认为loadValidatorMetadata中指示的模式应该就足够了)。
对我如何实现这一目标有什么建议吗?
更新:
似乎一切都正常,为了让Regex约束工作,在约束类中设置模式后,验证方法可以在验证器类中声明为空,如下所示:
namespace Foo\Bundle\StackBundle\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
/**
* @Annotation
*/
class PhoneValidator extends ConstraintValidator
{
public function validate($value, Constraint $constraint)
{
}
}
为CepValidator而不是PhoneValidator引发错误。
你有另一个文件…
src/Foo/Bundle/StackBundle/Validator/Constraints/CepValidator.php
…这缺少验证()方法。