Форма Symfony требуется только для пользовательских полей валидатора

Я изо всех сил пытаюсь найти способ сделать required только те поля, к которым прикреплен мой собственный валидатор. Есть ли способ добиться этого?

/**
* @var string
* @ORM\Column(type="string", length=255)
* @AdminAssert\CustomNotBlank(          // <--- this is my custom validator
*     groups={
*         //...
*     }
* )
*/
protected $name;

/**
* @var string
* @ORM\Column(type="string", length=255)
* @Assert\Email(
*     groups={
*         //...
*     }
* )
*/
private $email;

Так что в приведенном выше примере только $name должен иметь 'required' => trueпотому что это было подтверждено моим собственным валидатором CustomNotBlank, И нет поля, в котором нет этого валидатора, независимо от того, какие у него есть другие параметры валидации.

FormType на самом деле не имеет значения, потому что у меня есть много полей многих типов форм (это просто простой пример двух полей текстового типа)

4

Решение

По умолчанию Symfony\Component\Form\Extension\Validator\ValidatorTypeGuesser должен выполнить эту работу, если свойство имеет одно из следующих ограничений:

'Symfony\Component\Validator\Constraints\NotNull'
'Symfony\Component\Validator\Constraints\NotBlank'
'Symfony\Component\Validator\Constraints\IsTrue'

Таким образом, вам может понадобиться новый TypeGuesser, чтобы добавить свое пользовательское ограничение в список. Простое решение может быть украсить form.type_guesser.validator оказание услуг и переопределить публичный метод guessRequiredForConstraint() который содержит этот список:

public function guessRequiredForConstraint(Constraint $constraint)
{
switch (get_class($constraint)) {
case 'Symfony\Component\Validator\Constraints\NotNull':
case 'Symfony\Component\Validator\Constraints\NotBlank':
case 'Symfony\Component\Validator\Constraints\IsTrue':
case 'AppBundle\Validator\Constraints\CustomNotBlank': // <-- adds here
return new ValueGuess(true, Guess::HIGH_CONFIDENCE);
}
}

и required атрибут должен присутствовать в поле формы, если он имеет пользовательское ограничение.

Плюс: Как оформить услугу

Создает новый класс AppBundle\Validator\ValidatorTypeGuesser который выходит из исходного типа guesser, затем добавляет переопределенный метод и регистрирует его с тем же идентификатором службы оригинала, включая его тег и требуемые аргументы:

services:
form.type_guesser.validator:
class: AppBundle\Validator\ValidatorTypeGuesser
arguments: ['@validator.mapping.class_metadata_factory']
tags: ['form.type_guesser']
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector