Правильная обработка обязательных полей во время обновления сущности в формах Symfony.Php

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Правильная обработка обязательных полей во время обновления сущности в формах Symfony.

Сообщение Anonymous »


Предположим, у меня есть простая сущность Foo с обязательным текстовым полем bar.

пространство имен App\Entity; класс Фу { защищенная строка $bar; публичная функция getBar(): строка { вернуть $this->bar; } общедоступная функция setBar (строка $bar): void { $this->bar = $bar; } } Для управления этим объектом я использую Symfony Forms и класс FooType

класс FooType расширяет AbstractType { общедоступная функция buildForm (FormBuilderInterface $builder, массив $options): void { $builder->add('bar', TextType::class, ['required' => true]); } } ... и соответствующий FooController

класс FooController расширяет AbstractController { обновление публичной функции (Запрос $request, FooRepository $fooRepository, int $id): Ответ { $form = $this->createForm(FooType::class, $fooRepository->find($id)); $form->handleRequest($request); if ($form->isSubmited() && $form->isValid()) { ... } ... } } При такой конфигурации проверка внешнего интерфейса предотвращает отправку пустого значения в поле bar, и это хорошо.

Однако, когда кто-то обходит проверку внешнего интерфейса (например, предоставляя знак пробела), код аварийно завершает работу во время handleRequest со следующим сообщением:

Неперехваченное исключение PHP Symfony\Component\PropertyAccess\Exception\InvalidArgumentException: «Ожидаемый аргумент типа «строка», «ноль», заданный по пути к свойству «bar».» в /srv/vendor/symfony/property-access/PropertyAccessor.php, строка 211

Очевидно, что ошибка вызвана подсказкой типа в setBar(string $bar), где Symfony пытается предоставить null (пробелы обрезаются до пустой строки, а затем пустой строка анализируется до null).

Мне интересно, как правильно действовать в подобных ситуациях с помощью Symfony Forms. Я искал возможные решения, но ни одно из них не удовлетворяло:
[*]изменение подсказки типа в setBar на ?string недопустимо, поскольку поле bar в моем домене никогда не должно быть нулевым простое добавление 'empty_data' => '' приводит к тому, что $form->isValid() возвращает true, и объект сохраняется с пустым строковым значением, что явно не является ожидаемым результатом (поэтому я пометил его как обязательный) добавление 'constraints' => [new NotBlank()] не помогает, так как оно все равно пытается setBar(null) и приводит к сбою приложения
Похоже, что единственным рабочим решением является использование комбинации ограничений empty_data и NotBlank, как предложено здесь. Symfony 5 - Forms and Entities - ограничение NotBlank со строковым объектом, не допускающим значение NULL. атрибут

$builder->add('bar', TextType::class, [ 'обязательно' => правда, 'empty_data' => '', 'ограничения' => [новый NotBlank()], ]; Но добавление этого каждый раз, когда мне просто нужно иметь поле обязательное, выглядит как большие накладные расходы, поэтому я подумал, что должен быть какой-то лучший способ сделать это. Вероятно, я мог бы переопределить FormBuilder, чтобы он автоматически добавлял empty_data и NotBlank каждый раз, когда я устанавливаю поле required, но мне кажется, что Я изобретаю велосипед.

Что ещё интересно, похоже, проблема только с обновлением существующих моделей — создание новых (случайно?) работает, потому что условие $propertyValue !== $this->getPropertyValue($data, $ propertyPath) в PropertyPathAccessor имеет значение false (null !== null имеет значение false), и он пропускает вызов setBar< /code> со значением null.

Я что-то пропустил? Или так работает Symfony? (имхо возможен баг)
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Php»