我尝试创建自定义验证规则,以便在构建以下表单时使用: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中找不到
我的问题是:我误解了如何使用自定义验证器,或者我只是遗漏了某些东西或做错了吗?因为我不需要在构建表单时使用它,因为我需要在非映射属性上使用它。 这是一种合适的方式吗?或者可能还有其他方式?
答案 0 :(得分:2)
在基础Symfony\Component\Validator\Constraint
类中有validatedBy方法
public function validatedBy()
{
return get_class($this).'Validator';
}
意味着您的班级NotValidSearch
将由NotValidSearchValidator
而不是您选择的ContainsNotValidSearchValidator
进行验证。
您需要将验证者的名称更改为NotValidSearchValidator
或将validatedBy更改为验证者的正确名称。