En esta lección del Curso de Laravel 10 aprenderemos cómo podemos usar nuestro formulario para crear notas y guardar la información ingresada por el usuario en la base de datos. También aprenderemos sobre los ataques de tipo CSRF y cómo el framework Laravel nos protege de ellos.

Mira el código en GitHub: actual, resultado, comparación.

Declarando rutas con la misma URL

Recuerda que las rutas en Laravel se componen de dos elementos: verbo HTTP y URL.

Por lo tanto, podemos declarar dos rutas con la misma URL siempre y cuando los métodos HTTP (GETPOST, PATCH, PUT o DELETE) sean diferentes. Ejemplo:

Route::get('/notas', function () {
    // ...
})

Route::post('/notas', function () {
    return 'Procesando la creación de notas';
})->name('notes.store');

Creación de un formulario para enviar datos a un ruta de Laravel

Vamos a utilizar el helper route para generar nuestra ruta dentro del atributo action y agregando POST como valor del atributo method:

<form action="{{ route('notes.store') }}" method="POST">
   <!-- nuestro formulario -->
</form>

Solución al error de página expirada (419 Page Expired) en Laravel

Laravel incluye una protección para ataques de tipo CSRF (Cross-Site Request Forgery), los cuales ocurren cuando un sitio web malicioso envía peticiones a un sitio web legítimo en el cual hayas iniciado sesión dentro del mismo navegador.

Debido a la protección CSRF si intentamos enviar los datos de nuestro formulario a través de la petición POST, recibiremos un error. Para corregir esto simplemente debemos agregar la directiva @csrf dentro de nuestro formulario:

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

    <!-- nuestro formulario --> 
</form>

La directiva @csrf agrega un campo oculto dentro de nuestro formulario cuyo nombre es _token y su valor es un token especial que Laravel generará y luego reconocerá para autenticar la solicitud.

Diferencias entre métodos para obtener o enviar información

En Laravel podemos usar los siguientes tipos de rutas cuando queramos hacer cambios en nuestro sistema:

  • POST
  • PUT
  • PATCH
  • DELETE

Mientras que las rutas de tipo GET solo debemos usarlas para mostrar información.

Todas las rutas de tipo POST, PUT, PATCH y DELETE deben incluir la protección para ataques de tipo CSRF.

Obtener datos del formulario con el Facade Request

Para obtener todos los datos de nuestro formulario podemos usar Request::all():

use Illuminate\Support\Facades\Request;

Route::post('/notas', function () {
    return Request::all();
})->('notes.store');

Observa cómo debemos importar la clase Illuminate\Support\Facades\Request al principio del archivo.

Haciendo uso de la propiedad $fillable dentro de nuestro modelo podemos indicar a Laravel cuales son los campos que realmente queremos guardar en nuestra base de datos:

class Note extends Model
{
    protected $fillable = ['title', 'content'];
}

Tenemos dos formas de crear registros en Laravel utilizando el método create. Ambas aceptan un arreglo asociativo:

  1. La primera es pasando el resultado de llamar a Request::all() directamente y
  2. La segunda es pasando las propiedades una a una de forma explícita a través de Request::input.
use Illuminate\Support\Facades\Request;

// Pasando directamente el Request
Notes::create(Request::all())

// Pasando una a una las propiedades
Notes::create([
    'title' => Request::input('title'),
    'content' => Request::input('content')
]);

Obtener datos del formulario inyectando el objeto Request

También es posible inyectar el objeto de petición «Request» a través de la función anónima de la ruta o la acción del controlador. Para ello debemos importar el objeto Illuminate\Http\Request al principio del archivo.

<?php

//...
use Illuminate\Http\Request;

class NoteController

    public function store(Request $request)
    {
        // (Validacion de datos aqui)
        
        // Asignamos todos los datos de la peticion con:
        Note::create($request->all());

        // O podemos ser explícitos usando:
        Note::create([
            'title' => $request->input('title'),
            'content' => $request->input('content'),
        ]);

        // (Retornar repuesta aqui)
    }

Mi forma preferida es siendo explícito usando el método input porque es más flexible si queremos agregar más datos que no provengan de la petición original o en un formato diferente al de la petición original.

Recuerda que puedes aprender más sobre Programación orientada a objetos con PHP siguiendo nuestros Cursos Premium.

Únete a nuestra comunidad en Discord y comparte con los usuarios y autores de Styde, 100% gratis.

Únete hoy

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.

Lección anterior Creación de registros con Eloquent ORM en Laravel 10 Lección siguiente Validación de datos con Laravel 10 o superior