После каждого обновления страницы данные, отправленные через форму, продолжают добавляться в базу данных, и я не могу понять, почему. Я проверил шаблон Post/Redirect/Get (https://en.wikipedia.org/wiki/Post/Redirect/Get), но не смог понять, как его применить в моем случае. Потому что в моей функции AddComment() я использую оператор if, чтобы проверить, отправлена ли форма, а затем выполнить перенаправление.
/**
* @Route("/comments", name = "app_comments")
*/
public function indexAction(Request $request, EntityManagerInterface $entityManager): Response
{
$allComments = $this->getComments($entityManager);
$sortedComments = $this->sortComments($allComments);
$user = $this->getUser();
$comment = new Comment();
$commentForm = $this->commentForm($request, $comment);
$this->addComment($commentForm, $comment, $user, $entityManager, $_POST['parent_id'] ?? null);
$isCommentAlreadyLiked =
$entityManager->getRepository(CommentLike::class)->countByCommentAndUser($comment, $user);
return $this->renderForm('comments/index.html.twig',[
'form' => $commentForm,
'sortedComments' => $sortedComments,
'isCommentAlreadyLiked' => $isCommentAlreadyLiked
]);
}
private function getComments(EntityManagerInterface $entityManager): array
{
return $allComments = $entityManager->getRepository(Comment::class)->findAll();
}
public function addComment($form, $comment, $user, EntityManagerInterface $entityManager, ?int $parentId = null)
{
if ($form->isSubmitted() && $form->isValid()) {
$comment->setUser($user);
$comment->setCreatedAt(new \DateTime());
$comment->setParentId($_POST['parent_id'] ?? null);
$comment = $form->getData();
$entityManager->persist($comment);
$entityManager->flush();
return $this->redirectToRoute('app_comments');
}
return null;
}
public function commentForm(Request $request, $comment): FormInterface
{
$form = $this->createForm(CommentType::class, $comment);
$form->handleRequest($request);
return $form;
}
Я использую перенаправление после добавления данных в БД, как указано в шаблоне Post/Redirect/Get (https://en.wikipedia.org/wiki/Post/Redirect/Get), но это все равно не работает






Отправляется ли ваша форма методом POST или GET?
Также вы можете обернуть $form->handleRequest($request); в commentForm, чтобы проверить, является ли метод запроса POST $request->isMethod(Request::METHOD_GET).
public function commentForm(Request $request, $comment): FormInterface
{
$form = $this->createForm(CommentType::class, $comment);
if ($request->isMethod(Request::METHOD_GET)){
$form->handleRequest($request);
}
return $form;
}
Учитывая это, я не вижу ничего, что могло бы вызвать создание новых сущностей. Используете ли вы какой-либо js? Я мог бы проверить весь код, если вы загрузите его куда-нибудь, например, на github.
Ваша проблема в том, что в addComment вы возвращаете вызов redirect(), но возврат происходит из функции addComment, как только вы переходите к индексной функции, вы не возвращаете этот ответ, поэтому этот код пропускается, и в основном вы доходите до конца файла, в котором вы вызываете функцию renderForm().
Это приводит к тому, что ваше представление снова отображается без фактического перенаправления, поэтому объект формы теперь уже заполнен, и когда вы нажимаете F5, вы каждый раз запускаете отправку формы POST.
Обычно я использую одну и ту же функцию для выполнения всей логики формы и всего остального, но если ваш код большой и вы предпочитаете объединять его в функции, он будет подходить к нему следующим образом:
indexAction
/**
* @Route("/comments", name = "app_comments")
*/
public function indexAction(Request $request, EntityManagerInterface $entityManager): Response
{
$allComments = $this->getComments($entityManager);
$sortedComments = $this->sortComments($allComments);
$user = $this->getUser();
$comment = new Comment();
$commentForm = $this->commentForm($request, $comment);
if ($form->isSubmitted() && $form->isValid()) {
$this->addComment($commentForm, $comment, $user, $entityManager, $_POST['parent_id'] ?? null);
return $this->redirectToRoute('app_comments');
}
$isCommentAlreadyLiked =
$entityManager->getRepository(CommentLike::class)->countByCommentAndUser($comment, $user);
return $this->renderForm('comments/index.html.twig',[
'form' => $commentForm,
'sortedComments' => $sortedComments,
'isCommentAlreadyLiked' => $isCommentAlreadyLiked
]);
}
добавить комментарий
public function addComment($form, $comment, $user, EntityManagerInterface $entityManager, ?int $parentId = null)
{
$comment->setUser($user);
$comment->setCreatedAt(new \DateTime());
$comment->setParentId($_POST['parent_id'] ?? null);
$comment = $form->getData();
$entityManager->persist($comment);
$entityManager->flush();
}
Таким образом, вам не нужно возвращать перенаправления или нулевые значения в зависимости от условия, сохраните логику основной функции, а addComment просто управляет комментарием.
О чувак! Большое спасибо за это разъяснение, теперь все работает отлично! Иногда самое сложное — это уметь увидеть самое очевидное!
Да, мой друг, форма отправляется через POST. К сожалению, упаковка $form->handleRequest($request); с if ($request->isMethod(Request::METHOD_POST)) не помогло, и данные продолжают отправляться повторно :(