Cuando trabajamos con rutas de tipo resource en Laravel, una de las facilidades que nos ofrece es la creación automática de endpoints para las operaciones CRUD. Sin embargo, un detalle importante es que la ruta correspondiente al método update genera un endpoint que acepta tanto los verbos HTTP PUT como PATCH. Esto puede ser problemático si, por requerimientos de tu proyecto, necesitas que esa ruta acepte únicamente uno de estos verbos.
En este artículo, exploraremos este comportamiento, mostraremos cómo Laravel define ambas opciones por defecto y proporcionaremos una solución sencilla para personalizar este comportamiento sobrescribiendo el ResourceRegistrar.
El problema: ¿Por qué se generan PUT y PATCH?
Cuando defines una ruta resource en Laravel mediante el método Route::resource, el framework utiliza internamente el método addResourceUpdate para generar el endpoint del método update. Este es el código relevante del ResourceRegistrar:
Como puedes observar, Laravel define el endpoint del método update para aceptar tanto PUT como PATCH y no permite configurar únicamente uno de estos verbos de manera directa.
Si ejecutas el comando route:list en un proyecto Laravel, podrías ver algo como esto:
Específicamente, la ruta api/v1/library/books/{book} aparece configurada con ambos verbos HTTP (PUT|PATCH), y no es posible cambiar este comportamiento con la configuración predeterminada del framework.
Solución: Sobrescribiendo el ResourceRegistrar
Para resolver este problema, podemos sobrescribir el comportamiento predeterminado del ResourceRegistrar. Esto se logra creando una nueva clase que extienda de la original e inyectándola en el contenedor de servicios de Laravel. A continuación, te mostramos los pasos detallados:
1. Crear un CustomResourceRegistrar
Crea una nueva clase llamada CustomResourceRegistrar en la carpeta App\Routing o donde prefieras organizarla:
En este caso, hemos reemplazado los verbos PUT y PATCH por solo PUT. Si prefieres PATCH, puedes usar $this->router->patch en lugar de $this->router->put.
2. Sobrescribir el servicio en el AppServiceProvider
El siguiente paso es vincular el nuevo ResourceRegistrar al contenedor de servicios de Laravel. Esto se realiza en el método register del AppServiceProvider:
En este caso, utilizamos bind en lugar de singleton. La diferencia principal es que bind crea una nueva instancia de la clase cada vez que se solicita, mientras que singleton reutiliza la misma instancia en todo el ciclo de vida de la aplicación. Para este caso, bind es suficiente porque el ResourceRegistrar no necesita mantener estado entre las solicitudes.
3. Verificar el cambio
Una vez implementado este cambio, puedes ejecutar nuevamente el comando route:list para verificar que el método update de las rutas resource está configurado con el verbo HTTP que seleccionaste.
Por ejemplo, si elegiste solo PUT, deberías ver algo como esto:
Consideraciones adicionales
Este cambio afecta a todas las rutas resource del proyecto. Si deseas aplicar esta modificación solo a algunas rutas, puedes crear un método de registro de rutas personalizado en lugar de sobrescribir globalmente el
ResourceRegistrar.Asegúrate de documentar este cambio en tu proyecto para que otros desarrolladores comprendan el funcionamiento del
update.
Conclusión
Laravel facilita mucho el manejo de rutas con su sistema de recursos, pero no siempre cubre todos los casos específicos que podrían requerirse en un proyecto. Sobrescribir el ResourceRegistrar es una solución efectiva para personalizar el comportamiento de las rutas resource, permitiendo elegir entre PUT o PATCH para el método update según las necesidades de tu aplicación.
Con esta técnica, puedes mantener un mayor control sobre la configuración de tus rutas y asegurarte de cumplir con los estándares y requisitos de tu proyecto.
Curso Laravel 12
Completo 2026
El único curso 100% actualizado que incluye Laravel 12, Livewire 3, Vue 3, React 19 e Inertia 2. Aprende con proyectos reales y las últimas funcionalidades.
star Incluido en cualquier suscripción