Herramientas de usuario

Herramientas del sitio


informatica:programacion:php:frameworks:laravel:formularios

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
informatica:programacion:php:frameworks:laravel:formularios [2023/06/10 14:37] tempwininformatica:programacion:php:frameworks:laravel:formularios [2023/06/10 15:30] (actual) tempwin
Línea 92: Línea 92:
 </code> </code>
  
 +===== Datos provenientes de formularios =====
 +
 +Vamos a crear (almacenar) un producto a partir de la información recibida desde un formulario:
 +
 +<code php>
 +public function store() 
 +{
 +    $product = Product::create([
 +        'title' => request()->title,
 +        'description' => request()->description,
 +        'price' => request()->price,
 +        'stock' => request()->stock,
 +        'status' => request()->status,
 +    ]);
 +    
 +    return $product;
 +}
 +</code>
 +
 +Veremos un string JSON con el producto creado a través del formulario.
 +
 +Versión abreviada cogiendo todo lo que llegue de un formulario:
 +
 +<code php>
 +public function store() 
 +{
 +    $product = Product::create(request()->all());
 +    
 +    return $product;
 +}
 +</code>
 +
 +<WRAP center round important 60%>
 +Los atributos que se asignarán a nuestro modelo a partir del formulario serán los que hayamos indicado en el array de ''$fillable''.
 +</WRAP>
 +
 +===== Editando desde un formulario =====
 +
 +Los métodos que modificaremos en nuestro ProductController serán ''edit'' y ''update''. Uno mostrará el formulario de edición del producto y el otro hará efectiva la actualización.
 +
 +<code php>
 +public function edit($product) 
 +{
 +    return view("products.edit")->with([
 +        "product" => Product::findOrFail($product),
 +    ]);
 +}
 +
 +public function update($product) 
 +{
 +}
 +</code>
 +
 +Recordemos las rutas:
 +
 +<code php>
 +Route::get("products/{$product}/edit", "ProductController@edit")->name("products.edit");
 +
 +Route::match(["put", "patch"], "products/{$product}", "ProductController@update")->name("products.update");
 +</code>
 +
 +Para el formulario de edición, creamos la vista ''resources/views/products/edit.blade.php'':
 +
 +<code html5>
 +@extends("layout.master")
 +
 +@section("content")
 +    <h1>Edit a product</h1>
 +    
 +    <form method="post" action="{{ route("products.update", ["product" => $product->id]) }}">
 +        @csrf
 +        @method("PUT")
 +        <div class="form-row">
 +            <label>Title</label>
 +            <input class="form-control" type="text" name="title" value="{{ $product->title }}" required>
 +        </div>
 +        <div class="form-row">
 +            <label>Description</label>
 +            <input class="form-control" type="text" name="description" value="{{ $product->description }} required>
 +        </div>
 +        <div class="form-row">
 +            <label>Price</label>
 +            <input class="form-control" type="number" min="1.00" step="0.01" name="price" value="{{ $product->price }} required>
 +        </div>                
 +        <div class="form-row">
 +            <label>Stock</label>
 +            <input class="form-control" type="number" min="0" name="stock" value="{{ $product->stock }} required>
 +        </div>                  
 +        <div class="form-row">
 +            <label>Status</label>      
 +            <select class="custom-select" name="status" required>
 +                <option {{ $product->status == "available" ? "selected" : "" }} value="available">Available</option>                
 +                <option {{ $product->status == "unavailable" ? "selected" : "" }} value="unavailable">Unavailable</option>                                
 +            </select>
 +        </div>
 +        <div class="form-row">
 +            <button type="submit" class="btn btn-primary btn-lg">Edit product</button>
 +        </div>
 +    </form>
 +</code>
 +
 +Los navegadores solo procesan GET y POST, así que para forzar un tipo de petición, usamos ''@method'' que añadirá una etiqueta ''input'' oculta con el valor que le pasemos.
 +
 +Para realizar la actualización del producto, en el controlador:
 +
 +<code php>
 +public function update($product) 
 +{
 +    $product = Product::findOrFail($product);
 +    
 +    $product->update(request()->all());
 +    
 +    return $product;
 +}
 +</code>
 +
 +===== Eliminar de la base de datos =====
 +
 +En Laravel tenemos que usar un formulario también para eliminar productos. En nuestro controlador, modificaremos el método ''destroy'':
 +
 +<code php>
 +public function destroy($product) 
 +{
 +    $product = Product::findOrFail($product);
 +    
 +    $product->delete();
 +}
 +</code>
 +
 +Recordemos que debe existir una ruta:
 +
 +<code php>
 +Route::delete("products/{product}", "ProductController@destroy")->name("products.destroy");
 +</code>
 +
 +Finalmente, para dar la opción de eliminar un producto, basta con crear un enlace, pero debe ser usando el método DELETE:
 +
 +<code html5>
 +<form method="post" action="{{ route("products.destroy", ["product" => product->id]) }}">
 +    @csrf
 +    @method("DELETE")
 +    <button type="submit" class="btn btn-link">Delete</button>
 +</form>
 +</code>
informatica/programacion/php/frameworks/laravel/formularios.1686400665.txt.gz · Última modificación: por tempwin