仅在自定义验证器字段上需要 Symfony 表单



我正在努力找到一种方法来仅required那些附加了我自己的自定义验证器的字段。有什么办法可以做到这一点吗?

/**
* @var string
* @ORMColumn(type="string", length=255)
* @AdminAssertCustomNotBlank(          // <--- this is my custom validator
*     groups={
*         //...
*     }
* )
*/
protected $name;
/**
* @var string
* @ORMColumn(type="string", length=255)
* @AssertEmail(
*     groups={
*         //...
*     }
* )
*/
private $email;

所以在上面的例子中,只有$name必须有'required' => true,因为它是由我自己的验证器CustomNotBlank验证的。没有字段没有这个验证器,无论他们有什么其他验证设置。

FormType并不重要,因为我有许多表单类型的字段(这只是两个文本类型字段的简单示例(

默认情况下,如果属性具有以下约束之一,SymfonyComponentFormExtensionValidatorValidatorTypeGuesser应执行此工作:

'SymfonyComponentValidatorConstraintsNotNull'
'SymfonyComponentValidatorConstraintsNotBlank'
'SymfonyComponentValidatorConstraintsIsTrue'

因此,您可能需要一个新的 TypeGuesser 来将自定义约束添加到列表中。一个简单的解决方案可以是修饰form.type_guesser.validator服务并重写包含此列表的公共方法guessRequiredForConstraint()

public function guessRequiredForConstraint(Constraint $constraint)
{
switch (get_class($constraint)) {
case 'SymfonyComponentValidatorConstraintsNotNull':
case 'SymfonyComponentValidatorConstraintsNotBlank':
case 'SymfonyComponentValidatorConstraintsIsTrue':
case 'AppBundleValidatorConstraintsCustomNotBlank': // <-- adds here
return new ValueGuess(true, Guess::HIGH_CONFIDENCE);
}
}

如果required属性具有自定义约束,则它应该出现在表单字段中。

加:如何装饰服务

创建一个从原始类型猜测器扩展的新类AppBundleValidatorValidatorTypeGuesser,接下来添加重写的方法,并使用与原始方法相同的服务 ID 注册它,包括其标记和必需的参数:

services:
form.type_guesser.validator:
class: AppBundleValidatorValidatorTypeGuesser
arguments: ['@validator.mapping.class_metadata_factory']
tags: ['form.type_guesser']

相关内容

  • 没有找到相关文章

最新更新