В этом разделе мы реализуем действие deleteAction()
класса PostController
. Оно позволит
удалять определенный пост по заданному ID. Это действие будет принимать ID в виде GET-переменной,
проверять, существует ли пост с таким ID, и, если существует, удалять пост, относящиеся к нему
комментарии и связи тегов. Посетитель сайта сможет вызвать действие, набрав в адресной строке
браузера URL: http://localhost/posts/delete/<id>, где <id> - уникальный
идентификатор поста. После этого, действие перенаправляет пользователя на страницу Admin.
Сперва добавим метод removePost()
к сервису PostManager
. Этот метод будет удалять пост и связанные
с ним комментарии. Кроме того, он будет удалять связи между постом и тегами.
<?php
//...
class PostManager
{
//...
// Удаляет пост и все связанные с ним комментарии.
public function removePost($post)
{
// Удаляем связанные комментарии.
$comments = $post->getComments();
foreach ($comments as $comment) {
$this->entityManager->remove($comment);
}
// Удаляем связи тегов (если таковые есть)
$tags = $post->getTags();
foreach ($tags as $tag) {
$post->removeTagAssociation($tag);
}
$this->entityManager->remove($post);
$this->entityManager->flush();
}
}
В этом фрагменте мы сначала извлекаем все комментарии, связанные с постом, используя метод
getComments()
сущности Post
. Затем мы вызываем метод менеджера сущностей remove()
и
передаем ему каждый комментарий, который хотим удалить.
Далее, мы получаем все связанные с постом теги, вызывая метод getTags()
. Связь между постом
и тегом (но не сам тег!) удаляется с помощью метода removeTagAssociation()
сущности Post
(код метода смотрите ниже).
Наконец, мы удаляем сам пост методом менеджера сущностей remove()
, а затем применяем изменения к
базе данных с помощью метода flush()
.
Далее представлен код метода Post::removeTagAssociation()
:
// Удаляет связь между этим постом и заданным тегом.
public function removeTagAssociation($tag)
{
$this->tags->removeElement($tag);
}
Метод PostController::deleteAction()
извлекает ID поста, который нужно удалить и затем
проверяет, действителен ли этот ID. Если это так, он вызывает метод PostManager::removePost()`,
чтобы удалить пост и применить изменения к базе данных. После этого он перенаправляет посетителя
сайта на страницу Admin.
<?php
//..
class PostController extends AbstractActionController
{
// Это действие отображает страницу Delete Post.
public function deleteAction()
{
$postId = $this->params()->fromRoute('id', -1);
$post = $this->entityManager->getRepository(Post::class)
->findOneById($postId);
if ($post == null) {
$this->getResponse()->setStatusCode(404);
return;
}
$this->postManager->removePost($post);
// Перенаправляем пользователя на страницу "index".
return $this->redirect()->toRoute('posts', ['action'=>'admin']);
}
}