8-POST de Película (Creación de registros)

 

Introducción

En esta clase vamos a profundizar en cómo guardar registros en la base de datos usando Laravel. Si la clase anterior te pareció "muy light", aquí veremos procesos más interesantes de creación de datos.


1. Configuración de la Ruta POST

Archivo: routes/api.php

php
// Ruta existente GET (para obtener todas las películas)
Route::get('/movies', [MovieController::class, 'index']);

// Nueva ruta POST (para crear nuevas películas)
Route::post('/movies', [MovieController::class, 'store']);

Explicación:

  • Usamos Route::post en lugar de Route::get

  • El verbo POST en HTTP indica que vamos a crear algo nuevo

  • No necesitamos parámetros (como un ID) porque creamos desde cero

  • El método del controlador se llamará store


2. Creación del Método Store en el Controlador

Archivo: app/Http/Controllers/MovieController.php

php
public function store(Request $request)
{
    // Crear una nueva película con todos los datos recibidos
    $movie = Movie::create($request->all());
    
    // Retornar respuesta JSON con el objeto creado
    return response()->json([
        'data' => $movie,
        'message' => 'Película creada exitosamente'
    ], 201); // Código HTTP 201: Created
}

¿Qué hace este código?

  1. $request->all(): Obtiene TODOS los datos enviados en la solicitud POST

  2. Movie::create(): Método de Eloquent que crea y guarda el registro

  3. Código 201: Indica que se creó un recurso exitosamente


3. Estructura del Modelo Movie

Archivo: app/Models/Movie.php

php
class Movie extends Model
{
    use HasFactory;
    
    // Campos que se pueden llenar masivamente
    protected $fillable = [
        'title',
        'synopsis', 
        'year',
        'cover'
    ];
}

Importante: Los campos en $fillable son los únicos que se pueden asignar masivamente con create().


4. Probando con Postman

Configuración de la solicitud:

  1. Método: POST

  2. URL: http://tu-dominio.com/api/movies

  3. Headers:

    • Content-Type: application/json

  4. Body (raw JSON):

json
{
    "title": "El Laberinto del Fauno",
    "synopsis": "En 1944, en la España post-guerra civil, Ofelia y su madre se mudan con el brutal capitán Vidal. Ofelia descubre un laberinto donde conoce al fauno, quien le revela que ella es la princesa perdida del reino subterráneo.",
    "year": 2006,
    "cover": "https://ejemplo.com/cover-laberinto.jpg"
}

Respuesta esperada:

json
{
    "data": {
        "id": 11,
        "title": "El Laberinto del Fauno",
        "synopsis": "...",
        "year": 2006,
        "cover": "...",
        "created_at": "2024-01-15T10:30:00.000000Z",
        "updated_at": "2024-01-15T10:30:00.000000Z"
    },
    "message": "Película creada exitosamente"
}

5. Validación de Datos (Buenas Prácticas)

Versión mejorada del método store:

php
public function store(Request $request)
{
    // Validar los datos recibidos
    $validated = $request->validate([
        'title' => 'required|string|max:255',
        'synopsis' => 'required|string',
        'year' => 'required|integer|min:1900|max:' . date('Y'),
        'cover' => 'nullable|url|max:500'
    ]);
    
    // Crear la película con datos validados
    $movie = Movie::create($validated);
    
    return response()->json([
        'data' => $movie,
        'message' => 'Película creada exitosamente'
    ], 201);
}

6. Diferencia entre GET y POST

MétodoPropósitoVisible en URLIdempotente
GETObtener datosSí (parámetros en URL)
POSTCrear datosNo (datos en body)No

Ejemplo en navegador:

  • GET /movies → Muestra todas las películas

  • POST /movies → Crea una nueva película (no se puede ejecutar desde la barra de direcciones)


7. Solución de Problemas Comunes

Problema 1: Error "MassAssignmentException"

Solución: Asegúrate de tener los campos en $fillable del modelo.

Problema 2: Error 404 al hacer POST

Solución: Verifica que la ruta esté registrada correctamente en api.php.

Problema 3: Datos no se guardan

Solución:

php
// Verifica qué datos llegan
dd($request->all());

// O usa logging
Log::info('Datos recibidos:', $request->all());

8. Ejercicio Práctico

  1. Crea una nueva colección en Postman llamada "Laravel Movies API"

  2. Agrega un request POST a /movies

  3. Prueba crear 3 películas diferentes

  4. Verifica que aparezcan en la ruta GET /movies

  5. Intenta enviar datos inválidos y observa los errores


9. Resumen

  • ✅ Aprendimos a crear rutas POST en Laravel

  • ✅ Implementamos el método store en el controlador

  • ✅ Usamos Movie::create() para guardar registros

  • ✅ Probamos la API con Postman

  • ✅ Entendimos la diferencia entre GET y POST

  • ✅ Añadimos validación básica de datos


Próxima Clase

En el siguiente tutorial aprenderemos a actualizar registros existentes usando el método PUT/PATCH. ¡Nos vemos en el próximo vídeo!


Consejo final: Siempre valida los datos del usuario antes de guardarlos en la base de datos. ¡La seguridad es importante

Comentarios

Entradas más populares de este blog

Axios para Principiantes - Guía Paso a Paso

15-Tutorial: Crear Película en React con useState

Tutorial de React para Principiantes