Доступ к курсу "Symfony. Работа с формами." закрыт

Автор: yuriy cherepnev 18/11/2020 12:11:41

Дмитрий, подскажите, пожалуйста. Когда мы делаем форму для редактирования, мы обращаемся к той же сущности, к которой обращались и при обычной записи в БД. В этой сущности настроена валидация. Но если при редактировании мы стираем какое то поле и оставляем его пустым, нажимаем Submit, то такая форма не проходит валидацию, а сразу уходит на запись в БД и возвращается ошибка. Как это исправить? Symfony выдает такую ошибку: Expected argument of type "int", "null" given at property path "year".

Автор: dmchengaev 18/11/2020 12:11:46

Добрый день, Юрий.

К сожалению, не совсем понял вопрос.

Поле пустое, мы отправили форму. Если правильно настроена валидация полей сущности, форма не должна в этом случае уходить на запись в базу данных при пустых значениях. Вас должно вернуть назад к заполнению формы и служебных переменных должна отобразиться над формой информация о незаполненных полях.

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

/**
* @Assert\NotBlank(message="Поле не должно быть пустое")
*/
public $name;

Надеюсь, что это поможет.

Автор: yuriy cherepnev 18/11/2020 12:11:26

У меня валидация в сущности настроена. Она корректно работает при обычной записи в БД. Но когда я редактирую через форму и какое то поле оставляю пустым, то эта форма уходит на запись. У меня есть подозрение, что из за того, что объект был выгружен из базы данных и заполнил форму, Symfony такую форму считает валидной и не отправляет на проверку. Такой тип ошибки выдает: TypeError
Argument 1 passed to App\Entity\Library::setBook() must be of the type string, null given, called in C:\Users\yuriy\Desktop\OpenServer\domains\LibrarySymfony\vendor\symfony\property-access\PropertyAccessor.php on line 524

Автор: dmchengaev 18/11/2020 01:11:17

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

@Assert\NotBlank

Должен не пропускать сущность для добавления в базу данных. Здесь нужно разбираться почему не отрабатывает правило NotBlank.

Т.е. система допустила до сеттера setBook(), а там стоит TypeHint string, null - это не string. Отсюда и ошибка. Должна сначала отработать валидация.

Автор: yuriy cherepnev 18/11/2020 01:11:39

Ну я 2 проекта выполнил по этому уроку и в обоих проектах есть эта проблема. Так выглядит контроллер для редактирования:
class EditController extends AbstractController
{
/**
* @Route("/edit/{id}", name="edit")
* @param Library $library
* @param Request $request
* @param EntityManagerInterface $em
* @return Response
*/
public function edit(Request $request, EntityManagerInterface $em, Library $library): Response
{
$form = $this->createForm(EditBook::class, $library); //метод для создания формы
$form->handleRequest($request);

if ($form->isSubmitted() and $form->isValid()) {
$em->flush();
$this->addFlash('succes', 'Книга отредактирована');
return $this->redirectToRoute('edit', ['id'=>$library->getId()]);//редирект на страницу с нужным id
}
return $this->render('edit/index.html.twig', ['form' => $form->createView()]);
}
}

Если я из этой строки $form = $this->createForm(EditBook::class, $library); удалю $library и напишем так: $form = $this->createForm(EditBook::class) то валидация начинает работать корректно, но форма не заполняется. Много раз перепроверил все файлы, это ошибка именно в контроллере. Если у Вас сохранился учебный проект из этого урока, посмотрите, пожалуйста, в своем проекте, уходит ли на валидацию пустая форма при редактировании. Спасибо.

Автор: dmchengaev 18/11/2020 02:11:56

Да, проблему увидел. Как-то не задумывался об этом ранее.

Попробуйте в App\Entity\Library::setBook()

Прописать
public function setBook(?string $book): self

Т.е. перед string поставить знак вопроса. Другого решения в голову пока не приходит.

Автор: yuriy cherepnev 18/11/2020 03:11:29

Да, это помогло. Спасибо большое!