Introducción a las rutas RESTful en Laravel
Laravel ofrece herramientas integradas para definir rápidamente conjuntos completos de rutas siguiendo el patrón RESTful. Las más utilizadas son Route::resource y Route::apiResource. Aunque ambas generan endpoints para operaciones CRUD, están diseñadas para contextos difernetes: aplicaciones web tradicionales frente a APIs sin estado.
Rutas Resource para Aplicaciones Web
El método Route::resource crea un conjunto completo de rutas que incluye acciones para mostrar formularios (como crear o editar), además de las operaciones básicas sobre recursos. Es ideal cuando trabajas con vistas Blade y necesitas manejar estados mediante sesiones.
use Illuminate\Support\Facades\Route;
Route::resource('articulos', 'ArticuloController');
Este comando genera 7 rutas con los siguientes comportamientos:
| Método HTTP | URI | Acción | Nombre de ruta |
|---|---|---|---|
| GET | /articulos | index | articulos.index |
| GET | /articulos/create | create | articulos.create |
| POST | /articulos | store | articulos.store |
| GET | /articulos/{articulo} | show | articulos.show |
| GET | /articulos/{articulo}/edit | edit | articulos.edit |
| PUT/PATCH | /articulos/{articulo} | update | articulos.update |
| DELETE | /articulos/{articulo} | destroy | articulos.destroy |
Estas rutas se registran dentro del grupo web, lo que implica que heredan funcionalidades como protección CSRF, gestión de sesiones y cookies de autenticación.
Rutas API Resource para Servicios REST
Cuando construyes una API, no necesitas rutas que sirvan formularios HTML. En su lugar, solo requieres endpoints que respondan con datos estructurados (por ejemplo, JSON). Para este caso, Laravel proporciona Route::apiResource.
Route::apiResource('articulos', 'ArticuloController');
Esta variante omite automáticamente las acciones create y edit, ya que estas están orientadas a interfaces visuales. El resultado es un conjunto más ligero de 5 rutas:
| Método HTTP | URI | Acción | Nombre de ruta |
|---|---|---|---|
| GET | /articulos | index | articulos.index |
| POST | /articulos | store | articulos.store |
| GET | /articulos/{articulo} | show | articulos.show |
| PUT/PATCH | /articulos/{articulo} | update | articulos.update |
| DELETE | /articulos/{articulo} | destroy | articulos.destroy |
Las rutas generadas por apiResource normalmente se definen dentro del grupo api, que utiliza middleware como throttle, auth:sanctum o bindings, pero excluye mecanismos de sesión o CSRF.
Diferencias Clave
- Recursos visuales:
resourceincluyecreateyedit;apiResourceno. - Middleware:
resourceusa el grupoweb;apiResourcese asocia al grupoapi. - Respuestas: Los controladores para API generalmente devuelven JSON; los web retornan vistas.
Ejemplo de Controlador para API
Un controlador optimizado para API puede lucir así:
class ArticuloController extends Controller
{
public function index()
{
return response()->json(Articulo::all());
}
public function store(Request $request)
{
$articulo = Articulo::create($request->all());
return response()->json($articulo, 201);
}
public function show(Articulo $articulo)
{
return response()->json($articulo);
}
public function update(Request $request, Articulo $articulo)
{
$articulo->update($request->all());
return response()->json($articulo);
}
public function destroy(Articulo $articulo)
{
$articulo->delete();
return response()->noContent();
}
}
Observa el uso de inyección automática de modelos y respuestas JSON explícitas, comunes en APIs modernas.
Conclusión
La elección entre Route::resource y Route::apiResource depende del tipo de aplicación que estés desarrollando. Si tu proyecto entrega contenido HTML y maneja estados, opta por la versión completa. Si estás creando un backend para consumo por SPA, móviles o terceros, apiResource es más limpio y adecuado.