Я изо всех сил пытаюсь найти способ сделать 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
на самом деле не имеет значения, потому что у меня есть много полей многих типов форм (это просто простой пример двух полей текстового типа)
По умолчанию 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']
Других решений пока нет …