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:
POSTPUTPATCHDELETE
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