Laravel: Registros y formularios (parte 14)

Archivos:

  • routes/web.php
  • resources/views/cursos/show.blade.php
  • \app\Http\Controllers\CursoController.php
  • resources/views/cursos/edit.blade.php

Crear el formulario

Formulario HTML

Este es el código HTML que nos mostrará el formulario, lo escribiremos en la plantilla:

  <form action="{{route('cursos.store')}}" method="POST">

        <label>
            Nombre:<br>
            <input type="text" name="name">
        </label>
        <br>

        <label>
            Descripción:<br>
            <textarea name="description" rows="5"></textarea>
        </label>
        <br>

        <label>
            Categoría:<br>
            <input type="text" name="categoria">
        </label>
        <br>
        <button type="submit">Enviar formulario</button>
    
    </form>

Ruta para el formulario

Creamos una ruta tipo post para procesar los datos, hacia la url «cursos.store», usando el método store (que en seguida crearemos) del controlador CursoController:

Route::get('cursos', [CursoController::class, 'store'])->name('cursos.store');

En al formulario asignaremos la ruta en el parámetro action:

<form action="{{route('cursos.store')}}" method="POST">

Token de seguridad

Tenemos que añadir el token de seguridd del formulario que nos brinda Laravel:

 @csrf

Así podríamos acceder a cualquier propiedad de los cursos (id, descripción…).

Recuperar datos del formulario

Definimos un objeto de tipo Request en el método. Dentro del mismo podemos recuperar su valor.:

    public function store(Request $request){
        return $request->all();
    }

Ya podemos ver los valores enviados usando el formulario. Ahora hacemos uso del objeto Curso, y ya podemos guardar un nuevo curso en la base de datos:

       public function store(Request $request){
        // return $request->all();

        $curso = new Curso();

        $curso ->name= $request->name;
        $curso ->description= $request->description;
        $curso ->categoria= $request->categoria;

        $curso->save();
    }

Redirección del formulario

Veamos el registro una vez agregado.

Vamos un segundo a nuestro método index para que se ordenen los cursos de manera descendente (útil ahora mismo para pruebas):

 $cursos = Curso::orderBy('id','desc')->paginate();

Añadimos una redirección al método store que nos muestre los cursos:

       public function store(Request $request){
        // return $request->all();

        $curso = new Curso();

        $curso ->name= $request->name;
        $curso ->description= $request->description;
        $curso ->categoria= $request->categoria;

        $curso->save();

         //return redirect()->route('cursos.show',$curso->id);

         return redirect()->route('cursos.show',$curso);
    }

Aunque en esta ocasión no le hemos pasado la id del curso, sino el curso completo, Laravel lo hace de manera inteligente.

Formulario para editar registro

Ruta para editar el registro

Crearemos una nueva ruta en web.php, de tipo get, pasando un parámetro id por la url, con un nuevo método que enseguida crearemos, llamado edit:

    Route::get('cursos/{id}/edit', [CursoController::class, 'edit'])->name('cursos.edit');

Nos dirigimos a la vista show y agregamos un nuevo enlace donde rezará «editar curso», y le pasamos la nueva ruta que hemos creado, con el objeto curso:

    <a href="{{route('cursos.edit', $curso)}}">Editar curso</a>

Aquí el método edit que rescatará el objeto curso, para poder editarlo:

    public function edit($id) {
        $curso = Curso::find($id);
        return $curso;        
    }

Modificación en las rutas

Vamos a proceder a cambiar la forma que tenemos de recuperar la información. Primero cambiamos el método, usando como parámetro un objeto tipo Curso:

    public function edit(Curso $id) {

        return $id;        

    }

Renombramos las variables para evitar confusión:

    public function edit(Curso $curso) {
        return $curso;        
    }

Como hemos renombrado la variable tenemos que cambiar la ruta:

Route::get('cursos/{curso}/edit', [CursoController::class, 'edit'])->name('cursos.edit');

Usemos la misma técnica para el método show. Como la ruta ya usa una variable llamada curso, sólo cambiaremos el método. Véase que nos ahorramos una línea de código, que hemos comentado:

    public function show(Curso $curso){
        // $curso = Curso::find($id);
        return view("cursos.show", compact("curso"));
    }

Vista para editar el registro

Modificamos el método edit para mostrar una vista, a la que pasaremos el curso a editar.

    public function show(Curso $curso){
        // $curso = Curso::find($id);
        return view("cursos.show", compact("curso"));
    }

Creamos la vista edit.blade.php, duplicando la vista create (que ya tiene un formulario) en nuestra carpeta de vistas. Editamos el archivo creado añadiendo los tags values y sus valores (que serán los parámetros del curso elegido), y modificando un poco el texto para más claridad:

    <form action="{{route('cursos.store')}}" method="POST">

        @csrf

        <label>
            Nombre:<br>
            <input type="text" name="name" value="{{$curso->name}}">
        </label>
        <br>

        <label>
            Descripción:<br>
            <textarea name="description" rows="5" value="">
{{$curso->description}}</textarea>
        </label>
        <br>

        <label>
            Categoría:<br>
            <input type="text" name="categoria" value="{{$curso->categoria}}">
        </label>
        <br>
        <button type="submit">Actualizar curso</button>
    
    </form>

Ruta para guardar el registro

Crearíamos una ruta tipo post que se encargará de actualizar el registro y un método que llamaremos update para actualizarlo. Pero es recomendado que se utilice el método put para actualizar formularios.

La ruta la escribiremos así:

Route::put('cursos/{curso}', [CursoController::class, 'update'])->name('cursos.update');

Tenemos que cambiar el action del formulario par apuntar a esta ruta, y pasarle como parámetro el curso a editar, además de indicar que el método que usaremos será un método put:

(...)
    <form action="{{route('cursos.update', $curso)}}" method="POST">

        @csrf

        @method('put')
(...)

En el controlador crearemos el método put. Como parámetros, necesitamos tanto el contenido del formulario como el objeto curso (siguiendo las convenciones como anteriormente):

    public function update(Curso $curso) {
        return $curso;
    }

Si probamos el formulario veremos la información del curso. Pero tenemos que pasarle el objeto request para que capture los valores del formulario, y así lo podemos probar. Veremos que ahora pasa los parámetros method y el token:

       public function update(Request $request, Curso $curso) {
        return $request->all();
    }

De esta manera podemos editar el registro, y además redirigir a otra vista:

    public function update(Request $request, Curso $curso) {
        // return $request->all();

        $curso->name = $request->name;
        $curso->description = $request->description;
        $curso->categoria = $request->categoria;

        $curso->save();

        return redirect()->route('cursos.show',$curso->id);

    }

Recursos:

Enlace de Youtube: https://www.youtube.com/watch?v=oBxfBlV_2sU&list=PLZ2ovOgdI-kWWS9aq8mfUDkJRfYib-SvF&index=18