Laravel 10 E-Commerce Project

Laravel 10 E-Commerce Project - Shopping Cart


Video Thumbnail

In this tutorial, we will learn about creating a shopping cart.

Let's explore how to create a shopping cart.

Installing the Shopping Cart Package

To create a shopping cart, we will use the Hardevine shopping cart package.

First, let's install the shopping cart package. Go to Google and search for `Hardevine shoppingcart`.

Click on the first link and copy the composer command to install the package.

In the command prompt, paste the composer command and hit enter:


composer require hardevine/shoppingcart

The package has been installed. Now, let's publish the configuration by running the following command in the command prompt:


php artisan vendor:publish -- provider=`GloudemansShoppingcartShoppingcartServiceProvider` --tag=`config`

Creating a New Controller for the Cart

Now, let's create a new controller for the cart. Run the following command:


Php artisan make:controller CartController

Go to the Cart Controller and create a function:


use Cart;
public function index()
{
    $cartItems = Cart::instance('cart')->content();
    return view('cart', compact('cartItems'));
}

Creating a Route for the Cart

Now, let's create a route for the cart. Go to the web.php file and create the route:


Route::get('/cart',[CartController::class,'index'])->name('cart.index');

Creating the Cart View File

Now, let's create the cart view file. Extend the layout:


@extends(`layouts.base`);
@section(`content`)
@endsection

Go to the template directory and open the cart.html file in VS Code.

Copy the lines of code and paste them inside the cart.blade.php file, making the following changes:


@extends('layouts.base')
@section('content')
<section class=`breadcrumb-section section-b-space` style=`padding-top:20px;padding-bottom:20px;`>
    <ul class=`circles`>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
    </ul>
    <div class=`container`>
        <div class=`row`>
            <div class=`col-12`>
                <h3>Cart</h3>
                <nav>
                    <ol class=`breadcrumb`>
                        <li class=`breadcrumb-item`>
                            <a href=`{{route('app.index')}}`>
                                <i class=`fas fa-home`></i>
                            </a>
                        </li>
                        <li class=`breadcrumb-item active` aria-current=`page`>Cart</li>
                    </ol>
                </nav>
            </div>
        </div>
    </div>
</section>
<!-- Cart Section Start -->
<section class=`cart-section section-b-space`>
    <div class=`container`>
        @if($cartItems->Count() > 0)
        <div class=`row`>
            <div class=`col-md-12 text-center`>
                <table class=`table cart-table`>
                    <thead>
                        <tr class=`table-head`>
                            <th scope=`col`>image</th>
                            <th scope=`col`>product name</th>
                            <th scope=`col`>price</th>
                            <th scope=`col`>quantity</th>
                            <th scope=`col`>total</th>
                            <th scope=`col`>action</th>
                        </tr>
                    </thead>
                    <tbody>
                        @foreach ($cartItems as $item)                                                   
                        <tr>
                            <td>
                                <a href=`{{route('shop.product.details',['slug'=>$item->model->slug])}}`>
                                    <img src=`{{asset('assets/images/fashion/product/front')}}/{{$item->model->image}}` class=`blur-up lazyloaded` alt=`{{$item->model->name}}`>
                                </a>
                            </td>
                            <td>
                                <a href=`{{route('shop.product.details',['slug'=>$item->model->slug])}}`>{{$item->model->name}}</a>
                                <div class=`mobile-cart-content row`>
                                    <div class=`col`>
                                        <div class=`qty-box`>
                                            <div class=`input-group`>
                                                <input type=`text` name=`quantity` class=`form-control input-number`
                                                    value=`1`>
                                            </div>
                                        </div>
                                    </div>
                                    <div class=`col`>
                                        <h2>${{$item->price}}</h2>
                                    </div>
                                    <div class=`col`>
                                        <h2 class=`td-color`>
                                            <a href=`javascript:void(0)`>
                                                <i class=`fas fa-times`></i>
                                            </a>
                                        </h2>
                                    </div>
                                </div>
                            </td>
                            <td>
                                <h2>${{$item->price}}</h2>
                            </td>
                            <td>
                                <div class=`qty-box`>
                                    <div class=`input-group`>
                                        <input type=`number` name=`quantity` data-rowid=`{{$item->rowId}}` class=`form-control input-number` value=`{{$item->qty}}`>
                                    </div>
                                </div>
                            </td>
                            <td>
                                <h2 class=`td-color`>${{$item->subtotal()}}</h2>
                            </td>
                            <td>
                                <a href=`javascript:void(0)` onclick=`removeItemFromCart('{{$item->rowId}}')`>
                                    <i class=`fas fa-times`></i>
                                </a>
                            </td>
                        </tr>                       
                        @endforeach
                    </tbody>
                </table>
            </div>
            <div class=`col-12 mt-md-5 mt-4`>
                <div class=`row`>
                    <div class=`col-sm-7 col-5 order-1`>
                        <div class=`left-side-button text-end d-flex d-block justify-content-end`>
                            <a href=`javascript:void(0)` class=`text-decoration-underline theme-color d-block text-capitalize`>clear
                                all items</a>
                        </div>
                    </div>
                    <div class=`col-sm-5 col-7`>
                        <div class=`left-side-button float-start`>
                            <a href=`{{route('shop.index')}}` class=`btn btn-solid-default btn fw-bold mb-0 ms-0`>
                                <i class=`fas fa-arrow-left`></i> Continue Shopping</a>
                        </div>
                    </div>
                </div>
            </div>
            <div class=`cart-checkout-section`>
                <div class=`row g-4`>
                    <div class=`col-lg-4 col-sm-6`>
                        <div class=`promo-section`>
                            <form class=`row g-3`>
                                <div class=`col-7`>
                                    <input type=`text` class=`form-control` id=`number` placeholder=`Coupon Code`>
                                </div>
                                <div class=`col-5`>
                                    <button class=`btn btn-solid-default rounded btn`>Apply Coupon</button>
                                </div>
                            </form>
                        </div>
                    </div>
                    <div class=`col-lg-4 col-sm-6 `>
                        <div class=`checkout-button`>
                            <a href=`checkout` class=`btn btn-solid-default btn fw-bold`>
                                Check Out <i class=`fas fa-arrow-right ms-1`></i></a>
                        </div>
                    </div>
                    <div class=`col-lg-4`>
                        <div class=`cart-box`>
                            <div class=`cart-box-details`>
                                <div class=`total-details`>
                                    <div class=`top-details`>
                                        <h3>Cart Totals</h3>
                                        <h6>Sub Total <span>${{Cart::instance('cart')->subtotal()}}</span></h6>
                                        <h6>Tax <span>${{Cart::instance('cart')->tax()}}</span></h6>
                                        <h6>Total <span>${{Cart::instance('cart')->total()}}</span></h6>
                                    </div>
                                    <div class=`bottom-details`>
                                        <a href=`checkout`>Process Checkout</a>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
        @else
            <div class=`row`>
                <div class=`col-md-12 text-center`>
                    <h2>Your cart is empty !</h2>
                    <h5 class=`mt-3`>Add Items to it now.</h5>
                    <a href=`{{route('shop.index')}}` class=`btn btn-warning mt-5`>Shop Now</a>
                </div>
            </div>
        @endif
    </div>
</section>
@endsection

Add the if directive before this row:

<if($cartItems->Count() > 0)>

And close the if directive:

</if>

Creating a Function to Add Items to the Cart

Now, let's create a function to add items to the cart:


public function addToCart(Request $request)
{
    $product = Product::find($request->id);
    $price = $product->sale_price ? $product->sale_price : $product->regular_price;
    Cart::instance('cart')->add($product->id,$product->name,$request->quantity,$price)->associate('AppModelsProduct');
    return redirect()->back()->with('message','Success ! Item has been added successfully!');
}  

Route::post('/cart/store', [CartController::class, 'addToCart'])->name('cart.store');

Go to the details page and add the following:


<a href=`javascript:void(0)`  onclick=`event.preventDefault();document.getElementById('addtocart').submit();` id=`cartEffect` class=`btn btn-solid hover-solid btn-animation`>
    <i class=`fa fa-shopping-cart`></i>
    <span>Add To Cart</span>
    <form id=`addtocart` method=`post` action=`{{route('cart.store')}}`>
        @csrf
        <input type=`hidden` name=`id` value=`{{$product->id}}`>                                             
        <input type=`hidden` name=`quantity` id=`qty` value=`1`>
    </form>
</a>

Displaying the Cart Item Count in the Header Section

Now, let's display the cart item count in the header section and add a link for the cart as follows:

Go to the layout file and open the base.blade.php file, and add the following code:


<li class=`onhover-dropdown wislist-dropdown`>
    <div class=`cart-media`>
        <a href=`{{route('cart.index')}}`>
            <i data-feather=`shopping-cart`></i>
            <span id=`cart-count` class=`label label-theme rounded-pill`>
                {{Cart::instance('cart')->content()->count()}}
            </span>
        </a>
    </div>
</li>

It's done! Now, let's check.

Switch to the browser and refresh the page.

Here, you can see the number of products in the cart.

Now, let's add a new product to the cart.

You can see the number of products.

In this way, you can create a shopping cart in a Laravel 10 e-commerce project.

Written by Surfside Media

Senior Full Stack Developer specializing in Web Technologies.