A free and open-source book on ZF3 for beginners

Translation into this language is not yet finished. You can help this project by translating the chapters and contributing your changes.

12.11. Borrar una Publicación

En esta sección implementaremos la acción deleteAction() en el PostController. Esta acción permite borrar una publicación determinada dado su ID. La acción tomará el ID desde una variable GET, revisará si una publicación con el Id dado existe, si existe se borra la publicación, los comentario relacionados y las etiquetas asociadas. El visitante del sitio será capaz de lanzar la acción ingresando la siguiente URL en la barra de navegación del navegador web: http://localhost/posts/delete/<id>, donde <id> es el identificador único de la publicación. Finalmente, la acción redirecciona al visitante a la página de Admin.

12.11.1. Modificar el PostManager

Primero agregaremos el método removePost() en el servicio PostManager. Este método removerá la publicación y los comentarios asociados. Además, borrará las asociaciones entre la publicación y las etiquetas.

<?php
//...
class PostManager
{
  //...

  // Removes post and all associated comments.
  public function removePost($post)
  {
    // Remove associated comments
    $comments = $post->getComments();
    foreach ($comments as $comment) {
      $this->entityManager->remove($comment);
    }

    // Remove tag associations (if any)
    $tags = $post->getTags();
    foreach ($tags as $tag) {
      $post->removeTagAssociation($tag);
    }

    $this->entityManager->remove($post);

    $this->entityManager->flush();
  }
}

En el código de arriba primero recuperamos todos los comentarios asociados con una publicación usando del método getComments() de la entidad Post. Luego se llama al método remove() del EntityManager y se le pasa cada comentario que queremos borrar.

Luego traemos todas las etiquetas asociadas con la publicación llamando al método getTags() de Post. Eliminamos la asociación entre la publicación y la etiqueta (¡pero no la etiqueta misma!) con la ayuda del método removeTagAssociation() de Post (arriba se puede ver el código del método).

Finalmente borramos la publicación llamando al método remove() del EntityManager. Y aplicamos los cambios a la base de datos con el método flush().

Aquí esta el código del método Post::removeTagAssociation():

// Removes association between this post and the given tag.
public function removeTagAssociation($tag)
{
  $this->tags->removeElement($tag);
}

12.11.2. Agregar el Controlador de Tipo Acción

El método PostController::deleteAction() recupera el ID de la publicación que será borrada y revisa si es un ID de publicación valido. Si es valido se llama al método PostManager::removePost() para remover la publicación y aplicar los cambios en la base de datos. Finalmente, redireccionamos al visitante a la página Admin.

<?php

//..
class PostController extends AbstractActionController
{
  // This "delete" action displays the Delete Post page.
  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);

    // Redirect the user to "index" page.
    return $this->redirect()->toRoute('posts', ['action'=>'admin']);
  }
}

Top