Doctrine2: Comportamiento softdelete en Symfony2

¡Buenos días! ¡Mucho tiempo que no compartía un artículo con ustedes! Hoy les traigo un pequeño how-to sobre cómo habilitar la funcionalidad SoftDeleteable de Doctrine2 usando Symfony2.

Para los que alguna vez usamos la primera versión de Doctrine, bien recordamos que el comportamiento de SoftDelete era nativo en el ORM. Con la versión 2 las cosas han cambiado. Este tipo de funciones ya no son nativas pero se pueden habilitar a través de extensiones.

Requisitos

  • Symfony 2.1 con composer
  • Doctrine 2.x
  • Annotation Mapping para Entidades
  • YML para la configuración de servicios


1 - Instalando DoctrineExtensions

Usando composer.phar, la instalación de módulos, bundles, extensiones o plugins es muy sencilla. Lo primero que tenemos que hacer es abrir nuestro composer.json y agregar la siguiente línea al array de requires:

> Enlace al código <

Guardamos el archivo y procedemos a actualizar las dependencias de nuestro proyecto:

you@yourcomputer:~/SymfonyProject
you@yourcomputer:~/SymfonyProject$ php composer.phar update
you@yourcomputer:~/SymfonyProject$


2 - Configurando las extensiones como Servicios

Ahora que ya tenemos las extensiones instaladas, debemos de configurar Doctrine para utilizarlas. Voy a ser breve en este tutorial ya que sólo explicaré como habilitar SoftDelete, pero Gedmo/DoctrineExtensions nos permite utilizar los siguientes comportamientos: Translatable, Sluggable, Loggable, Timestampable, Tree y Sortable. Si te interesa alguno de ellos, pásate por aquí para aprender a usarlos.

Symfony2 tiene una arquitectura muy bella que permite configurar casi todas las dependencias y clases a modo de servicios y completamente desacoplados (gracias al patrón de inyección de dependencias y el DIC). Para las extensiones de Doctrine vamos a crear un nuevo archivo en app/config con el nombre de doctrine_extensions.yml y luego lo importaremos en el archivo app/config/config.yml:

> Enlace al código <

Dentro del archivo doctrine_extensions.yml, copiaremos lo siguiente:

> Enlace al código <

Con esto ya hemos configurado las extensiones como un servicio que será ejecutado cada vez que el Kernel reaccione (para configurar Doctrine) y cada vez que Doctrine dispare un evento (como la eliminación de una entidad, que es lo que nos interesa).

Ahora necesitamos el Listener que hará que Doctrine incorpore las extensiones configuradas. Para ello debemos crear la clase Acme/DemoBundle/Listener/DoctrineExtensionListener.php con el siguiente contenido:

> Enlace al código <

Vale aclarar que Acme\DemoBundle debe ser reemplazado por el Bundle que ustedes utilicen, y recuerden de actualizar el doctrine_extensions.yml con el nombre de su clase!!!

3 - Configurar las entidades

Habilitar la extensión no hará que todas las entidades que eliminemos hereden el comportamiento automágicamente.

Para que un objeto sea SoftDeleteable debemos configurarlo. A continuación voy a mostrar cómo se hace con Annotations de PHP, pero es igual para YML o XML:

> Enlace al código <


3 - Probar el comportamiento

Este es el último paso de nuestra travesía. Si eliminamos un objeto usando Doctrine y luego revisamos la base de datos, veremos que el campo deletedAt tiene el timestamp de eliminación ¡Esto es SoftDeleteable Behavior!

> Enlace al código <



Bien, eso fue todo. ¡Espero les haya sido de utilidad!

¡Hasta la próxima!

Comentarios

comments powered by Disqus

Los comentarios están deshabilitados debido a que has rechazado las cookies en este sitio.

Restablecer Cookies
Copyright © 2014 - Sergio Lepore
Desarrollado con Hexo y alojado en Github

Nota legal: Las opiniones expresadas en el presente blog son mis opiniones personales y bajo ningún modo representan la opinión de mi empleador
Política de Cookies