Como crear un carrito de compras en PHP Laravel

Hola Geek, en esta ocasión aprenderemos a realizar un carrito de compras haciendo uso del paquete "darryldecode/laravelshoppingcart"  que ofrece gran facilidad a la hora de construir nuestro carrito de compras, el paquete maneja carrito para usuarios autenticados con sessiones especificas o bien un carrito cuando no requieres estar autenticado. Este paquete es de código abierto y con una licencia MIT.


Manos a la obra

Instalando paquetes

Lo primero que haremos es instalar el paquete darryldecode/laravelshoppingcart. Desde la consola, por medio de composer:

composer require "darryldecode/cart"

Abrimos config/app.php y agregamos la siguiente línea en el array de "Providers".

Darryldecode\Cart\CartServiceProvider::class,

Agregamos la siguiente línea en "Aliases"

'Cart' => Darryldecode\Cart\Facades\CartFacade::class,
Opcional: Puedes editar el archivos de configuration (Si deseas tener todo el control de configuración) escribiendo:
php artisan vendor:publish --provider="Darryldecode\Cart\CartServiceProvider" --tag="config"

Este comando generará un archivo de configuración en config/shopping_cart.php para este pequeño ejemplo, no será necesario editar este archivo. Pero te recomiendo leer la documentación de este paquete.

Creando formulario para agregar items al carrito
Crearemos una nueva vista (home.blade.php) , en la cual agregaremos productos/items a nuestro carrito mediante un formulario. La vista quedará así:

home.blade.php 
  <form>
                    <div class="form-group">
                        <label for="id">ID</label>
                        <input type="text" name="id" class="form-control" id="id">
                    </div>
                    <div class="form-group">
                        <label for="name">NOMBRE</label>
                        <input type="text" name="name" class="form-control" id="name">
                    </div>
                    <div class="form-group">
                        <label for="price">PRECIO</label>
                        <input type="text" name="price" class="form-control" id="price">
                    </div>
                    <div class="form-group">
                        <label for="quantity">CANTIDAD</label>
                        <input type="text" name="quantity" class="form-control" id="quantity">
                    </div>
                    <div class="form-group">
                        <label for="color">COLOR</label>
                        <select class="form-control" name="color" id="color">
                            <option value="blanco">blanco</option>
                            <option value="azul"> azul</option>
                        </select>
                        <small class="form-text text-muted">Atributo</small>
                    </div>

                    <div class="form-group">
                        <label for="tamano">TAMAÑO</label>
                        <select name="tamano" class="form-control" id="tamano">
                            <option value="chico">Chico</option>
                            <option value="grande">Grande</option>
                        </select>
                        <small class="form-text text-muted">Atributo</small>
                    </div>
                    <button type="submit" class="btn btn-primary">Agregar al carrito</button>
                </form>

 Agregando items al carrito
Crearemos un controlador de tipo recurso con:

php artisan make:controller CartController -r

Agregaremos la ruta para nuestro controlador en routes/web.php

    Route::resource('/cart', 'CartController');

Nuestra función index() en CartController.php apuntará a nuestro blade con el formulario previamente creado.

 

    public function index()
    {
        return view('home');
    }

En nuestra vista home.blade.php agregaremos el metodo (post), la ruta del controlador para almacenar el carrito (cart.store) y el csrf token:

 <form method="POST" action="{{route('cart.store')}}">
      @csrf

Nuestra función store() en CartController.php queda:
No olvidemos agregar el alias al controlador:

use Cart;
    public function store(Request $request)
    {
        Cart::add(array(
            'id' => $request->id?$request->id:'1', // inique row ID
            'name' => $request->name?$request->name:'example',
            'price' =>$request->price?$request->price:20.20,
            'quantity' => $request->quantity?$request->quantity:1,
            'attributes' => array(
                'color' => $request->color?$request->color:'green',
                'size' => $request->size?$request->size:'Big',
            )
        ));
        return back();
    }

Mostrando carrito

En nuestra blade home.blade.php agregaremos una tabla donde visualizaremos nuestro carrito y agregaremos una columna para eliminar el item del carrito.

                @if (!Cart::isEmpty())
                <table class="table">
                    <thead>
                        <tr>
                            <th sc ope="col">Accion</th>
                            <th sc ope="col">#ID</th>
                            <th scope="col">Nombre</th>
                            <th scope="col">Precio</th>
                            <th scope="col">Cantidad</th>
                            <th scope="col">Atributos</th>
                        </tr>
                    </thead>
                    <tbody>
                        @foreach (Cart::getContent() as $item)
                        <tr>
                            <th scope="row">
                                <button>Eliminar</button>
                            </th>
                            <th scope="row">{{$item->id}}</th>
                            <td>{{$item->name}}</td>
                            <td>{{$item->price}}</td>
                            <td>{{$item->quantity}}</td>
                            <td>
                                @foreach ($item->attributes as $key => $attribute)
                                {{$key}}: {{$attribute}}.
                                @endforeach
                            </td>
                        </tr>
                        @endforeach
                    </tbody>
                </table>

                @endif


Eliminando items del carrito

En nuestra blade home.blade.php en la tabla donde visualizamos nuestro carrito agregaremos una form para eliminar el item del carrito.
 

<th scope="row">
       <form method="POST" action="{{route('cart.destroy',$item->id)}}">
          @method('DELETE')
          @csrf
          <button type="submit">Eliminar</button>
      </form>
</th>

En nuestra función destroy() en el controlador CartController.php:
 

    public function destroy($cart)
    {
        Cart::remove($cart);
        return back();
    }

Mostrando cantidad de items, total, sub total 

Agregaremos una nueva tabla a nuestra blade:

<table class="table">
      <thead>
                <tr>
                    <th sc ope="col">Items</th>
                    <th sc ope="col">Sub total</th>
                    <th scope="col">Total</th>
                 </tr>
      </thead>
      <tbody>
                  <tr>
                      <th scope="row">{{Cart::getTotalQuantity()}}</th>
                      <th scope="row">{{Cart::getSubTotal()}}</th>
                      <th scope="row">{{Cart::getTotal()}}</th>
                   </tr>
      </tbody>
</table>

Eliminando carrito

Para eliminar el carrito, solo debes llamar al metodo clear:

Cart::clear();

Actualizando carrito

Para actualizar tu carrito de compras, debes llamar al metodo update:
 

// si debes actualizar solo la cantidad de producto
Cart::update(456, array(
  'quantity' => 2, // si la cantidad actual del producto es 1, se sumarán 2 items dando como resultado 3 
));

// Tambien puedes reducir la cantidad de un item especifico:
Cart::update(456, array(
  'quantity' => -1, // a la cantidad actual, se le restará uno
));

O bien, solo puedes llamar al metodo Add y si el itemId ya existe, los datos se reemplazarán y se sumará la cantidad actual, con la nueva cantidad dada.


Codigo fuente

https://github.com/IglesiasJavier/LaravelCart

Gracias por leer este pequeño ejemplo. Si tienes alguna pregunta o sugerencia, no dudes en dejarla en los comentarios, me gustaría saber tu opinión.


SOBRE EL AUTOR
Javi Zamora
Javi Zamora

Hola soy Javier creador de Visión Código con la intención de ayudar a los nuevos jovenes programadores con pequeños tutoriales que te salvan la vida.