¡Esta es una revisión vieja del documento!
Trabajando con formularios en Laravel
Crear formulario
Si queremos crear un formulario que nos permita añadir un producto, vamos al controlador y nos centramos en el método create:
public function create() { return view("products.create"); }
Crearemos una vista resources/views/products/create.blade.php:
@extends("layout.master")
@section("content")
<h1>Create a product</h1>
<form method="post" action="{{ route("products.store" }}">
<div class="form-row">
<label>Title</label>
<input class="form-control" type="text" name="title" required>
</div>
<div class="form-row">
<label>Description</label>
<input class="form-control" type="text" name="description" required>
</div>
<div class="form-row">
<label>Price</label>
<input class="form-control" type="number" min="1.00" step="0.01" name="price" required>
</div>
<div class="form-row">
<label>Stock</label>
<input class="form-control" type="number" min="0" name="stock" required>
</div>
<div class="form-row">
<label>Status</label>
<select class="custom-select" name="status" required>
<option value="" selected>Select...</option>
<option value="available">Available</option>
<option value="unavailable">Unavailable</option>
</select>
</div>
<div class="form-row">
<button type="submit" class="btn btn-primary btn-lg">Create product</button>
</div>
</form>
Recordemos que tenemos estas rutas en routes/web.php para este caso:
Route::get("products/create", "ProductController@create")->name("products.create"); Route::post("products", "ProductController@store")->name("products.store");
Por tanto, cuando se envíe el formulario, se llamará al método store del ProductController mediante POST:
public function store() { dd("Estamos en store"); }
Esto no nos funcionará porque, por defecto, Laravel tiene protección contra CSRF (Cross-site request forgery). Se asegura que las peticiones que se hagan a nuestra web, vengan realmente de nuestra web.
Para solucionarlo, en nuestros formularios debemos añadir un token CSRF:
@extends("layout.master")
@section("content")
<h1>Create a product</h1>
<form method="post" action="{{ route("products.store" }}">
@csrf
Esa instrucción de Blade incluye un campo HTML oculto en el formulario:
<form method="post" action=""> <input type="hidden" name="_token" value="123h4jkl123khxvbnasd12"
