A free and open-source book on ZF3 for beginners


12.11. Удаление поста

В этом разделе мы реализуем действие deleteAction() класса PostController. Оно позволит удалять определенный пост по заданному ID. Это действие будет принимать ID в виде GET-переменной, проверять, существует ли пост с таким ID, и, если существует, удалять пост, относящиеся к нему комментарии и связи тегов. Посетитель сайта сможет вызвать действие, набрав в адресной строке браузера URL: http://localhost/posts/delete/<id>, где <id> - уникальный идентификатор поста. После этого, действие перенаправляет пользователя на страницу Admin.

12.11.1. Изменение PostManager

Сперва добавим метод 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);
}

12.11.2. Добавление действия контроллера

Метод 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']);
    }
}

Top