Как исправить: Doctrine не возвращается должным образом

Я хочу сделать функцию динамического удаления сообщений, но результат будет ошибкой, потому что значение равно null.

Контроллер

/**
  * @Route("/posts/delete/{id}", name = "delete_post", methods = {"DELETE"})
  */
  public function deletePost($id, LoggerInterface $logger)
  {

    $post=$this->getDoctrine()->getRepository(Article::class)->find($id);

    if (!$post)
    {
        $this->addFlash(
            'notice',
            'Something went wrong'
        );
        $logger->info($id);
    }
    else
    {

        $entityManager=$this->getDoctrine()->getManager();
        $entityManager->remove($post);
        $entityManager->flush();
        $entityManager->clear();
    }

    $response=new Response();
    return($response);
  }

JS

const articles = document.getElementById("articles");

if (articles) {
 articles.addEventListener("click", e => {
  if (e.target.className === "btn btn-danger delete-article") {
  if (confirm("Are you sure?")) {
    const id = e.target.getAttribute("data-id");

    fetch("/posts/delete/${id}", {
      method: "DELETE"
    }).then(res => window.location.reload());
  }
 }
 });
}

Веточка

<table border = "1" id = "articles">
        <tr>
            <th class = "pt">Post title</th>
            <th class = "pe">Edit</th>
            <th class = "pd">Delete</th>
        </tr>
        {% for article in articles %}
            <tr>
                <td class = "title">{{ article.title }}</td>
                <td class = "edit">
                    <a href = "{{ path('posts_editor', {'id':article.id}) }}" class = "btn btn-primary edit-article">
                        <img src = "{{ asset('images/edit.png') }}" class = "image">
                    </a>
                </td>
                <td class = "delete">
                    <a href = "#" class = "btn btn-danger delete-article" data-id = "{{article.id}}">
                        <img src = "{{ asset('images/delete.png') }}" class = "image">
                    </a>
                </td>
            </tr>
        {% endfor %}
    </table>

Я делал это с помощью видеоурока, и я не знаю, что не так с видео, этот код работал, но когда я его написал, я просто получил ошибку ниже

Ошибка

EntityManager#remove() expects parameter 1 to be an entity object, NULL given.

Надеюсь, кто-нибудь может мне помочь, я действительно расстраиваюсь, потому что это не работает.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
313
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ясно сказано, что $пост равно нулю, поэтому в этом случае вы можете сбросьте эти две переменные, и я надеюсь, вы поймете, что происходит

dump($id);
dump($post);
exit

вы можете посмотреть документ Доктрина Удаление сущностей

обновлено:

в вашем коде вы всегда отправляете ответ, вам нужно обновить ответ на конкретный код успеха или ошибки, по умолчанию он отправляет код 200, а также вам нужно обновить свой код

public function deletePost($id, LoggerInterface $logger)
{

$post=$this->getDoctrine()->getRepository(Article::class)->find($id);

    if (!$post)
    {
        $this->addFlash(
            'notice',
            'Something went wrong'
        );
        $logger->info($id);

        exit() your code here
        or throw an exception here
    }

    try {
        //remove entity here 
        $response = new Response(
            'Content',
            Response::HTTP_OK,
            ['content-type' => 'text/html']
        );

        return $response;
    } catch (\Exception $exception) {
        $response = new Response(
            $exception->getMessage(),
            Response::HTTP_INTERNAL_SERVER_ERROR,
            ['content-type' => 'text/html']
            );
        return $response;
    }
}

Я пробовал дамп. Проблема в том, что профилировщик показывает: "Контент не был сброшен", поэтому я решил обратиться за помощью, потому что понятия не имею, что не так.

Matt 26.05.2019 13:11

когда вы нажимаете «Удалить», затем проверьте профайлер в опции ajax, а также остановите перенаправление после успеха, чтобы вы могли увидеть ответ.

habibun 26.05.2019 13:25

Спасибо за помощь! Просто нужно было добавить переменную другим способом в файл JS

Matt 26.05.2019 13:55
Ответ принят как подходящий

Фиксированный

Просто пришлось изменить это

fetch("/posts/delete/${id}", {
  method: "DELETE"
}).then(res => window.location.reload());

В этом

fetch("/posts/delete/" + id, {
      method: "POST"
    }).then(res => window.location.reload());

Теперь он удаляет сообщения правильно

Проблема заключается в кавычках вокруг «/posts/delete/${id}», чтобы ${id} правильно интерпретировался и заменялся, вместо этого вам нужен символ « ` » в качестве кавычки.

Jonathan Gray 26.05.2019 13:57

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