我正在努力找到一种方法来仅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']