Comentarios anidados con Laravel

En esta entrada, vamos a crear un sistema de comentarios anidados desde 0 con Laravel. ¿Y qué es un sistema de comentarios anidados? Pues, básicamente, es un sistema de comentarios en el que los comentarios pueden tener comentarios hijos, es decir, respuestas. Podríamos decir, que será algo parecido al sistema que tiene WordPress y que puedes ver en este mismo blog en la sección de comentarios (por ejemplo, aquí).

Preparación y migraciones

Primero de todo, debemos tener un proyecto Laravel, si no lo tienes echa un vistazo a este post. Una vez tengamos el proyecto ya listo, tenemos que crear las migraciones para generar las tablas necesarias en la base de datos. Vamos a crear una para los posts y otra para los comentarios:

Con estos comandos, se nos generarán los archivos para las migraciones. En el archivo de migración de la tabla posts podremos lo siguiente:

Y en el de la tabla comentarios lo siguiente:

Como puedes ver, le estamos indicando que un comentario tiene una relación con un post, un usuario creador y que puede tener un comentario padre (es decir, que podría ser respuesta de un comentario). Este último, no es obligatorio al haber puesto que puede ser null (nullable()).

Ejecutamos las migraciones:

 

Modelos

Creamos los dos modelos, uno para los posts y otro para los comentarios. En el de los posts ponemos este código:

Y en el modelo de los comentarios ponemos este código:

El código anterior creo que es bastante entendible, pero simplemente lo que le estamos indicando a los modelos son las relaciones que hemos comentado antes.

 

Controladores y rutas

Ahora vamos a crear los controladores, que serán los que tendrán toda la lógica. Aunque primero de todo vamos a añadir las rutas al archivo de rutas. Si quieres saber más sobre rutas y los controladores, échale un vistazo a este post.

Una vez tenemos las rutas, creamos los controladores, uno para los posts y otro para los comentarios. En el de los posts ponemos el siguiente código:

Y en el de los comentarios éste:

Lo que hace el código del método store es crear un objeto comentario con los datos que nos llegan del formulario y con el id del usuario logueado (el que hace el comentario). Después, simplemente, lo guardamos y redirigimos a la url del post.

Como mejora, estaría bien ponerle una validación de que los datos que nos llegan del formulario son los que queremos y en el formato que queremos.

 

Vistas

Para que funcione todo esto, aún nos falta una cosa más, las vistas. La primera vista que vamos a crear va a ser la de la ficha del post. Creamos un archivo llamado show.blade.php en el directorio resources/views/posts/ :

Al la vista 'comments.list' , que ahora crearemos, le estamos pasando los comentarios que no tienen padre, es decir, los comentario que no tienen respuestas (parent_id = null) e incluimos el formulario para añadir comentarios.

Cuando tengamos esto, aún nos seguirá sin funcionar porque nos faltan las vistas de los comentarios que son las dos vistas que incluye ( @include ) el archivo anterior y una más.

Creamos la vista del formulario de envío de comentarios en  resources/views/comments/form.blade.php :

Creamos la de la lista de comentarios en resources/views/comments/list.blade.php:

Y finalmente, la del comentario en sí en resources/views/comments/item.blade.php:

Esta última vista, será la que haga que visualmente parezca que un comentario cuelga de otro, es decir, que visualmente tenga respuestas. Se comprueba si el comentario actual del bucle tiene respuestas (replies), si tiene, se vuelve a inlcuir la lista ( 'comments.list') con las respuestas y así. Esto hará que sea recursivo y que por muchos que añadamos, siempre salgan de esta forma.

 

Si todo ha ido bien, el resultado final debería ser este (los usuarios están generados con seeders):

 

 

-


Aloja tu proyecto en DigitalOcean: Obtén $200 de crédito gratis al registrarte a través de este enlace.

Si hay cualquier tipo de error en el post o te surge cualquier duda, no dudes en ponerlo en los comentarios o enviarme un correo desde la página de contacto.

? CONTACTAR

Un comentario en “Comentarios anidados con Laravel

Deja una respuesta

  Acepto la política de privacidad