Laravel te ofrece muchas formas de hacer las cosas. Con los controladores, no es diferente. Vimos que ya podemos usar el enrutamiento explícito del controlador, y ahora veremos que también podemos implementar el enrutamiento con recursos con nuestros controladores. Existen muchos beneficios al utilizar el enrutamiento con recursos. El principal beneficio es que al seguir la convención sobre la configuración, seremos capaces de escribir menos código usando métodos tranquilos, y aún así tendremos tanta o más funcionalidad que antes. ¡Vamos a ver!


¿Qué es REST?

Primero, hablemos de la transferencia del estado de reposo o de representación. El descanso fue definido por primera vez por un caballero llamado Roy Fielding. Roy hizo uso de REST para diseñar URI o identificadores uniformes de recursos y HTTP 1.1. Muchas aplicaciones y sitios web ahora ofrecen servicios web, y es cada vez más común usar REST para esto en lugar del SOAP demasiado complicado.

REST tiene 6 limitaciones principales:

  • Servidor de cliente
  • Apátrida
  • Caché
  • Sistema en capas
  • Código a pedido
  • Interfaz uniforme

Además, REST utiliza verbos HTTP específicos o métodos de solicitud, como GET POST PUTyDELETE

Esta tabla ofrece una excelente descripción general y casos de uso de los diversos métodos de solicitud RESTful. Es posible que también desee ver cómo crear una API de descanso con node y express.

Métodos HTTP de la API RESTful
RecursoOBTENERPONERENVIARELIMINAR
URI de colección, como /resourcesEnumere los URI y quizás otros detalles de los miembros de la colección.Reemplace toda la colección por otra colección.Crea una nueva entrada en la colección. El URI de la nueva entrada se asigna automáticamente y, por lo general, la operación lo devuelve.Elimina toda la colección.
URI de elemento, como /resources/item17Recupere una representación del miembro de la colección al que se dirige, expresada en un tipo de medio de Internet apropiado.Reemplace el miembro designado de la colección o, si no existe, créelo .No se usa generalmente. Trate al miembro al que se dirige como una colección por derecho propio y cree una nueva entrada en ella.Elimina el miembro de la colección al que se dirige.

¿Cómo se relaciona REST con Laravel?

Taylor Otwell y su equipo tomaron en consideración los objetivos arquitectónicos del estilo de desarrollo RESTful. Tenemos acceso a esto usando un resourceen nuestro routes.phparchivo. Sin embargo, primero, ejecutemos este comando:

php artisan routes

+ -------- + ------------------- + ------ + ------------- ----------- + ---------------- + --------------- +
| Dominio | URI | Nombre | Acción | Antes de los filtros | Después de los filtros |
+ -------- + ------------------- + ------ + ------------- ----------- + ---------------- + --------------- +
| | GET agentes | | AgentsController @ index | | |
| | GET agentes / {nombre} | | AgentsController @ show | | |
+ -------- + ------------------- + ------ + ------------- ----------- + ---------------- + --------------- +

Estas rutas todavía están registradas en nuestra aplicación cuando creamos un par de controladores enrutados explícitamente en la publicación Introducción a los controladores LaravelEs genial que podamos ejecutar un comando simple y mirar todas las rutas registradas en la aplicación, ¿no crees?

Ahora abra su routes.phparchivo, borre todas las rutas, guarde el archivo, luego ejecute el comando nuevamente:
php artisan routes
Artisan nos lo dirá alegremente

Tu aplicación no tiene rutas.

¡Excelente! Ahora sabemos cómo comprobar el estado de nuestras rutas registradas en cualquier momento.


Recurso de ruta

Advertencia: actividades alucinantes más allá de este punto.

Creemos un recurso de ruta en nuestro routes.phparchivo. Es realmente fácil, solo agregamos un fragmento como este:

Lo que esto nos dice es que estamos creando un recurso de publicaciones de blog y nuestro BlogpostsController manejará las acciones que se tomen en este recurso. Esa línea de código hizo mucho por nosotros. Ok, ¿cuál es el problema, Jack? Bueno, ¿por qué no ejecutamos el comando nuevamente y vemos qué sucede?

php artisan routes

+ -------- + -------------------------------- + ------- ------------ + ----------------------------- + ------- --------- + --------------- +
| Dominio | URI | Nombre | Acción | BeforeFilters | Después de los filtros |
+ -------- + -------------------------------- + ------- ------------ + ----------------------------- + ------- --------- + --------------- +
| | OBTENER blogs | blogposts.index | BlogpostsController @ index | | |
| | OBTENER blogs / crear | blogposts.create | BlogpostsController @ crear | | |
| | POST entradas de blog | blogposts.store | BlogpostsController @ tienda | | |
| | OBTENER publicaciones de blog / {publicaciones de blog} | blogposts.show | BlogpostsController @ show | | |
| | OBTENER publicaciones de blog / {blogposts} / editar | blogposts.edit | BlogpostsController @ editar | | |
| | PONER entradas de blog / {entradas de blog} | blogposts.update | BlogpostsController @ update | | |
| | PARCHE entradas de blog / {entradas de blog} | | BlogpostsController @ update | | |
| | BORRAR publicaciones de blog / {publicaciones de blog} | blogposts.destroy | BlogpostsController @ destroy | | |
+ -------- + -------------------------------- + ------- ------------ + ----------------------------- + ------- --------- + --------------- +

¡Vaya! ¿Lo que acaba de suceder? Bueno, Laravel acaba de registrar 8 rutas RESTful para ti en un abrir y cerrar de ojos.

Bien, ahora tenemos que empezar a pensar en los recursos . En este caso anterior, las publicaciones de blog son nuestro recurso. Entonces, ¿qué significa esto? Repasemos línea por línea:

OBTENER publicaciones de blog

Enviar una GETsolicitud al http://you.rock/blogpostsURI enumerará todas las publicaciones del blog.

Método de controlador: index ()

OBTENER publicaciones de blog / crear

El envío de una GETsolicitud al http://you.rock/blogposts/createURI debería darnos un formulario para crear una nueva publicación de blog.

Método de controlador: create ()

POST entradas de blog

Una vez que ingrese toda la información en su formulario, debe enviar una POSTsolicitud a la http://you.rock/blogpostscual la almacenará en la base de datos.

Método del controlador: store ()

OBTENER publicaciones de blog / {blogposts}

Enviar una GETsolicitud http://you.rock/blogposts/blogpostidhttp://you.rock/blogposts/slug-of-blogpostpermitir la visualización de una publicación de blog específica .

Método del controlador: show ()

OBTENER publicaciones de blog / {blogposts} / editar

Enviar una GETsolicitud http://you.rock/blogposts/blogpostid/edithttp://you.rock/blogposts/slug-of-blogpost/editdebe proporcionar un formulario completo para editar una publicación de blog existente.

Método del controlador: editar ()

PONER entradas de blog / {entradas de blog}

Enviar una solicitud PUT http://you.rock/blogposts/blogpostidhttp://you.rock/blogposts/slug-of-blogpostactualizar una publicación de blog específica.

Método del controlador: update ()

PATCH entradas de blog / {blogposts}

PATCHes similar a PUT.

BORRAR publicaciones de blog / {publicaciones de blog}

Enviar una DELETEsolicitud http://you.rock/blogposts/blogpostidhttp://you.rock/blogposts/slug-of-blogpostdebe destruir o eliminar una publicación de blog específica.

Método del controlador: destroy ()

Guau. Eso es algo de trabajo pesado🙂


Crea tu controlador

Ahora que hemos creado nuestro recurso y examinado todas las rutas registradas que nos proporciona, creemos un controlador para aprovechar lo que hemos hecho hasta ahora:

php artisan controller:make BlogpostsController

Resultado: ¡El controlador se creó correctamente!

Recordemos nuestro modelo de publicación de blog , que hace uso de la relación pertenece a muchosEl código está aquí para refrescar nuestra memoria:

¡Increíble! Como ya tenemos un modelo hecho, agreguemos algo de código alindex()método de nuestro Blogposts Controller para que podamos probar nuestro nuevo enrutamiento ingenioso.

Ok, visitemos http://you.rock/blogpostsDedos cruzados.

¡Oh si bebé! Hey ahora, hey ahora, aquí lo que digo ahora! ¿Entonces, cómo funciona? Bueno, así es como fluiría el código:

Este es solo un ejemplo de la index()ejecución de nuestro método. En el futuro, queremos crear la lógica en nuestro controlador de Blogposts para que nuestros métodos create() store() show() edit() update()y también sean destroy()funcionales.


El RESTful Takeaway

El uso de Resourceful Routing y el estilo de desarrollo RESTful tiene muchas ventajas para usted.

Convención sobre configuración

Le ayuda a mantenerse en la mentalidad de la convención sobre la configuración. De esta manera, en lugar de nombrar a los métodos de su controlador todo tipo de locuras, sabrá que mientras use index() create() store() show() edit() update()destroy(), las cosas normalmente funcionarán . Un buen punto para recordar también es que, si usa Artisan para crear sus controladores, esos métodos estarán allí de forma predeterminada de todos modos.

Archivo de rutas mucho más limpio

No vas a escapar de tu routes.phparchivo, lo necesitarás para todo lo que hagas en Laravel. Así que tendría sentido mantenerlo lo más limpio posible. Podemos comenzar con el enrutamiento a los cierres, limpiar las cosas con el enrutamiento explícito a los controladores, o simplemente registrar un recurso y dejar que Laravel configure automáticamente nuestras rutas registradas, 8 a la vez para nosotros. Incluso si estamos usando enrutamiento explícito a los controladores, si su aplicación comienza a ser bastante grande, tener decenas o incluso cientos de definiciones de ruta para cada acción que necesita realizar será engorroso.

Sea explícito solo cuando sea necesario

Ahora podemos ver que el enrutamiento con recursos es realmente bueno para nosotros. Eso no significa que se adaptará a todas las facetas de sus necesidades de desarrollo web. No es gran cosa. Simplemente registre recursos para obtener todas las tareas comunes y repetitivas que tendrá que hacer de todos modos, luego, cuando tenga casos extremos que no encajen en esta convención, simplemente registre algunas rutas explícitas a los controladores para completar lo que sea. es lo que estás tratando de hacer.