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



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Ясно сказано, что $пост равно нулю, поэтому в этом случае вы можете сбросьте эти две переменные, и я надеюсь, вы поймете, что происходит
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;
}
}
когда вы нажимаете «Удалить», затем проверьте профайлер в опции ajax, а также остановите перенаправление после успеха, чтобы вы могли увидеть ответ.
Спасибо за помощь! Просто нужно было добавить переменную другим способом в файл JS
Фиксированный
Просто пришлось изменить это
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} правильно интерпретировался и заменялся, вместо этого вам нужен символ « ` » в качестве кавычки.
Я пробовал дамп. Проблема в том, что профилировщик показывает: "Контент не был сброшен", поэтому я решил обратиться за помощью, потому что понятия не имею, что не так.