Herramientas de usuario

Herramientas del sitio


informatica:programacion:php:frameworks:laravel:formularios

¡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"
informatica/programacion/php/frameworks/laravel/formularios.1686400665.txt.gz · Última modificación: por tempwin