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.
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);
}
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']);
}
}