Tutorial de Laravel

9. Implementa los métodos CRUD

9.1 Implementa C (Create)

LibroController incluye el método create() que es llamado por la RESTful HTTP API GET /libros/create (ver routes/web.php) y se usará para servir el formulario HTML usado para enviar datos y el método store() que es mapeado por la RESTful HTTP API POST /libros (ver routes/web.php) y se usará para guardar un producto en la base de datos desde los datos enviados desde el formulario.

Vamos a implementar estos dos métodos:

Reabre el controlador app/Http/Controllers/LibroController.php.

Localiza el método create() y actualízalo:

public function create()
{
    return view('libros.create');
}

En negrita está el código añadido. Ahora, localiza el método store() y actualízalo:

public function store(Request $request)
{
    $libro_data = $request->validate([
        'título'=>'required|max:100',
        'autor'=>'required|max:255',
        'precio'=>'required|numeric'
    ]);

    Libro::create($libro_data);

    return redirect('/libros')->with('success', '¡Libro guardado!');
}

En negrita está el código añadido. Como puedes observar, el método create() devuelve la vista libros.create. Esta vista la tenemos que crear y definir más adelante en la plantilla resources/views/libros/create.blade.php.

Antes de crear la plantilla create.blade.php es recomendable crear una plantilla base que será ampliada por las siguientes plantillas facilitando así la organización del código.

Para ello, en la carpeta resources/views, creamos el fichero base.blade.php:

<!DOCTYPE html>
<html xmlns='http://www.w3.org/1999/xhtml' lang='en'>
  <head>
    <meta charset='utf-8' />
    <meta name='viewport' content='width=device-width, initial-scale=1.0' />
    <link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css' />
    <title>Librería</title>
  </head>

  <body class='container'>

    <h1 class='display-2 mt-1 mb-4'>Librería</h1>

    @yield('main')

  </body>
</html>
<!DOCTYPE html>
<html xmlns='http://www.w3.org/1999/xhtml' lang='en'>
  <head>
    <meta charset='utf-8' />
    <meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no' />
    <title>CRUD en Laravel</title>
    <link href="{{ asset('bootstrap.min.css') }}" rel='stylesheet' type='text/css' />
  </head>

  <body>
    <div class='container'>
      @yield('main')
    </div>
  </body>
</html>

Descarga Bootstrap y mueve el fichero bootstrap.min.css a la carpeta public que es la carpeta pública de tu aplicación web.

Creada la plantilla base, creamos la plantilla para insertar/crear un producto. Para ello, crea resources/views/libros/create.blade.php:

@extends('base')

@section('main')
<div class='row'>
  <div class='col-sm-8 offset-sm-2'>
    <h1 class='display-3'>Añadir un producto</h1>
    <div>
      @if ($errors->any())
      <div class='alert alert-danger'>
        <ul>
          @foreach ($errors->all() as $error)
            <li>{{ $error }}</li>
          @endforeach
        </ul>
      </div>
      <br />
      @endif
      <form method='post' action="{{ route('libros.store') }}">
        @csrf
        <div class='form-group'>
          <label for='título'>Título:</label>
          <input type='text' class='form-control' name='título' />
        </div>
        <div class='form-group'>
          <label for='descripción'>Descripción:</label>
          <input type='text' class='form-control' name='descripción' />
        </div>
        <div class='form-group'>
          <label for='precio'>Precio:</label>
          <input type='number' class='form-control' name='precio' />
        </div>
        <button type='submit' class='btn btn-primary'>Añadir</button>
      </form>
    </div>
  </div>
</div>
@endsection

Vamos a comprobar que funciona.

Iniciamos el servidor de desarrollo de Laravel:

php artisan serve

Abrimos el navegador y entramos en http://localhost:8000/libros/create.

Al completar el formulario y pulsar en Añadir se hace un POST a la ruta /libros (http://localhost:8000/libros). Se ha insertado un nuevo producto en la base de datos, compruébalo en PhpMyAdmin.

Como puedes observar, no aparece nada al pulsar Añadir, eso es porque hemos redirigido al usuario a la ruta /libros cuyo controlador y vista tenemos que crear en la siguiente sección.

Volver.

Curso creado por Manuel Ignacio López Quintero bajo esta licencia.