Symfony2自定义验证限制表单构建器中的使用

时间:2014-07-14 10:45:49

标签: php forms validation symfony

我尝试创建自定义验证规则,以便在构建以下表单时使用:example

以下是我的观点:

namespace Path\ToBundle\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 */
class NotValidSearch extends Constraint
{
    public $message = 'Search string is invalid format.';
}



namespace Salda\ClientControlBundle\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;


class ContainsNotValidSearchValidator extends ConstraintValidator
{
    public function validate($value, Constraint $constraint)
    {
        if (count(explode(' ', $value)) !== 3) {
            $this->context->addViolation($constraint->message);
        }
    }
} 

然后尝试在表单构建器类中使用它:

use Path\ToBundle\Validator\Constraints\NotValidSearch;

$builder->add('search', 'search', array(
    'label' => 'Predecessor',
    'required' => false,
    'mapped' => false,
    'constraints' => new NotValidSearch(array(
        'message' => 'invalid message ph'
    ))
));

但是当我提交表单时,它会抛出错误: 致命错误:Class' Path \ ToBundle \ Validator \ Constraints \ NotValidSearchValidator'在第71行的/path/to/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Validator/ConstraintValidatorFactory.php中找不到

我的问题是:我误解了如何使用自定义验证器,或者我只是遗漏了某些东西或做错了吗?因为我不需要在构建表单时使用它,因为我需要在非映射属性上使用它。 这是一种合适的方式吗?或者可能还有其他方式?

1 个答案:

答案 0 :(得分:2)

在基础Symfony\Component\Validator\Constraint类中有validatedBy方法

public function validatedBy()
{
    return get_class($this).'Validator';
}

意味着您的班级NotValidSearch将由NotValidSearchValidator而不是您选择的ContainsNotValidSearchValidator进行验证。

您需要将验证者的名称更改为NotValidSearchValidator或将validatedBy更改为验证者的正确名称。