Данные формы продолжают добавляться при обновлении страницы | Симфони

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
71
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Отправляется ли ваша форма методом 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;

}

Да, мой друг, форма отправляется через POST. К сожалению, упаковка $form->handleRequest($request); с if ($request->isMethod(Request::METHOD_POST)) не помогло, и данные продолжают отправляться повторно :(

Officer Pulaski 22.12.2022 11:03

Учитывая это, я не вижу ничего, что могло бы вызвать создание новых сущностей. Используете ли вы какой-либо js? Я мог бы проверить весь код, если вы загрузите его куда-нибудь, например, на github.

eddien 22.12.2022 15:31
Ответ принят как подходящий

Ваша проблема в том, что в 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 просто управляет комментарием.

О чувак! Большое спасибо за это разъяснение, теперь все работает отлично! Иногда самое сложное — это уметь увидеть самое очевидное!

Officer Pulaski 29.12.2022 22:20

Другие вопросы по теме