Implementando el Método PUT para Películas (Actualización)
- Obtener vínculo
- X
- Correo electrónico
- Otras apps
Objetivo
Aprender a implementar el método PUT en una API RESTful para actualizar registros de películas existentes en la base de datos.
Paso 1: Configurar la Ruta PUT en el Archivo de Rutas
Vamos al archivo app.php (o routes/api.php dependiendo de tu estructura) y agregamos una nueva ruta:
// Ruta para actualizar una película existente
$app->put('/movies/{id}', function ($request, $response, $args) {
// El parámetro {id} nos permitirá identificar qué película actualizar
$id = $args['id'];
// Llamamos al método correspondiente en el controlador
$response->getBody()->write("Actualizando película con ID: $id");
return $response;
});Explicación:
Usamos
puten lugar depostpara indicar que es una operación de actualizaciónEl parámetro
{id}en la URL nos permite identificar el registro específicoEsta convención sigue los verbos HTTP estándar: POST para crear, PUT para actualizar
Paso 2: Crear el Método en el Controlador
En el controlador MovieController.php, creamos el método update:
<?php
class MovieController
{
// Método para actualizar una película existente
public function update(Request $request, Response $response, array $args)
{
// Obtenemos el ID desde los parámetros de la URL
$id = $args['id'];
// Buscamos la película en la base de datos
$movie = Movie::findOrFail($id);
// Actualizamos la película con los datos recibidos
$movie->update([
'title' => $request->getParam('title'),
'director' => $request->getParam('director'),
'year' => $request->getParam('year'),
'genre' => $request->getParam('genre')
]);
// Retornamos la respuesta
$response->getBody()->write(json_encode([
'message' => 'Película actualizada exitosamente',
'movie' => $movie
]));
return $response->withHeader('Content-Type', 'application/json');
}
}Paso 3: Entendiendo findOrFail()
¿Qué hace findOrFail()?
$movie = Movie::findOrFail($id);Busca un registro en la tabla
moviescon el ID especificadoSi encuentra el registro, lo retorna como un objeto
Si NO lo encuentra, automáticamente lanza una excepción
En el contexto HTTP, esta excepción se traduce en un error 404 (Not Found)
Ventajas:
Código más limpio (no necesitamos verificar manualmente si existe)
Manejo automático de errores
Respuestas HTTP apropiadas
Paso 4: Actualizar la Ruta para Usar el Controlador
Actualizamos nuestra ruta para que use el método del controlador:
// Importar el controlador (si no está importado)
use App\Controllers\MovieController;
// Configurar la ruta PUT
$app->put('/movies/{id}', [MovieController::class, 'update']);Paso 5: Probar con Postman
Configuración de Postman:
Método: PUT
URL:
http://tudominio.com/movies/11El número 11 es el ID de la película a actualizar
Headers:
textContent-Type: application/jsonBody (raw JSON):
json{ "title": "Gladiador 2", "director": "Ridley Scott", "year": 2024, "genre": "Acción/Drama" }
Respuesta Esperada:
{
"message": "Película actualizada exitosamente",
"movie": {
"id": 11,
"title": "Gladiador 2",
"director": "Ridley Scott",
"year": 2024,
"genre": "Acción/Drama",
"updated_at": "2024-01-15 10:30:00"
}
}Paso 6: Manejo de Errores (Mejora Opcional)
Podemos mejorar nuestro método para manejar validaciones:
public function update(Request $request, Response $response, array $args)
{
try {
$id = $args['id'];
$movie = Movie::findOrFail($id);
// Validar datos antes de actualizar
$data = $request->getParsedBody();
$validator = new Validator();
$validation = $validator->validate($data, [
'title' => 'required|max:255',
'year' => 'required|integer|min:1900|max:' . date('Y')
]);
if ($validation->fails()) {
return $response->withJson([
'errors' => $validation->errors()
], 422);
}
// Actualizar solo los campos que vienen en la petición
$movie->fill($data);
$movie->save();
return $response->withJson([
'message' => 'Película actualizada',
'movie' => $movie
]);
} catch (ModelNotFoundException $e) {
return $response->withJson([
'error' => 'Película no encontrada'
], 404);
}
}Puntos Clave Aprendidos
✅ PUT vs POST:
POST: Crear nuevos recursos
PUT: Actualizar recursos existentes
✅ Parámetros en URL:
Usamos
{id}en la ruta para identificar el recursoAccedemos con
$args['id']en el controlador
✅ findOrFail():
Método elegante para buscar registros
Maneja automáticamente el caso "no encontrado"
✅ Request Body:
Recibimos los datos a actualizar en formato JSON
Usamos
$request->getParsedBody()para acceder a ellos
✅ Respuesta HTTP:
200 OK: Actualización exitosa
404 Not Found: Recurso no existe
422 Unprocessable Entity: Datos inválidos
Próximo Paso: DELETE
En el siguiente tutorial aprenderemos a implementar el método DELETE para eliminar registros de la base de datos, completando así las operaciones CRUD (Create, Read, Update, Delete).
Consejo: Siempre verifica que el ID existe antes de intentar actualizar, y considera usar transacciones si tu actualización involucra múltiples tablas relacionadas.
- Obtener vínculo
- X
- Correo electrónico
- Otras apps
Comentarios
Publicar un comentario