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 (GET
, POST
, 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:
- La primera es pasando el resultado de llamar a
Request::all()
directamente y - 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.
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