laravel-shop/FACADES_IMPLEMENTATION.md

4.7 KiB

Shop and Cart Facades Implementation Summary

Overview

Successfully implemented two core Facades for the Laravel Shop package to simplify the API for Laravel developers.

Files Created

1. Facades

src/Facades/Shop.php

  • Static accessor for shop-related functionality
  • Provides convenient methods for product browsing and inventory management
  • Type-hinted methods for IDE autocomplete support

src/Facades/Cart.php

  • Static accessor for shopping cart operations
  • Simplifies cart management without needing authentication context
  • Type-hinted methods for IDE autocomplete support

2. Services

src/Services/ShopService.php

Core implementation for shop operations:

  • products() - Get all products query builder
  • product($id) - Get single product
  • categories() - Get all categories
  • inStock() - Get in-stock products
  • featured() - Get featured products
  • published() - Get published and visible products
  • search($query) - Search products
  • checkStock($product, $quantity) - Verify stock availability
  • getAvailableStock($product) - Get available quantity
  • isOnSale($product) - Check if product is on sale
  • config($key, $default) - Get shop configuration
  • currency() - Get default currency

src/Services/CartService.php

Core implementation for cart operations:

  • current() - Get current authenticated user's cart
  • forUser($user) - Get cart for specific user
  • find($cartId) - Find cart by ID
  • add($product, $quantity, $parameters) - Add item to cart
  • remove($product, $quantity, $parameters) - Remove item from cart
  • update($cartItem, $quantity) - Update item quantity
  • clear() - Clear cart
  • checkout() - Checkout cart
  • total() - Get cart total
  • itemCount() - Get item count
  • items() - Get cart items
  • isEmpty() - Check if empty
  • isExpired() - Check if expired
  • isConverted() - Check if converted
  • unpaidAmount() - Get unpaid amount
  • paidAmount() - Get paid amount

3. Service Provider Updates

Updated src/ShopServiceProvider.php to:

  • Bind shop.service to ShopService in the container
  • Bind shop.cart to CartService in the container
  • Register both facades for easy access throughout the application

Test Coverage

tests/Feature/ShopFacadeTest.php (23 tests)

Tests for Shop facade functionality:

  • Product retrieval and filtering
  • Category access
  • Stock checking
  • Search functionality
  • Configuration access
  • Query builder chaining
  • Pagination support

tests/Feature/CartFacadeTest.php (26 tests)

Tests for Cart facade functionality:

  • Cart retrieval and creation
  • Adding items with parameters
  • Removing items
  • Updating quantities
  • Cart clearing and checkout
  • Total and count calculations
  • Cart status checks
  • Paid/unpaid amount tracking
  • Multi-product operations

Test Results

All 49 new tests pass All 391 total tests pass (including existing tests) 7 tests skipped (intentional) No regressions to existing functionality

Usage Examples

Shop Facade

use Blax\Shop\Facades\Shop;

// Get featured products
$featured = Shop::featured()->with('prices')->get();

// Check stock availability
if (Shop::checkStock($product, 2)) {
    // Add to cart
}

// Search products
$results = Shop::search('laptop')->paginate(10);

// Get available stock
$available = Shop::getAvailableStock($product);

Cart Facade

use Blax\Shop\Facades\Cart;

// Add to cart
Cart::add($product, quantity: 2, parameters: ['size' => 'L']);

// Get cart info
$total = Cart::total();
$count = Cart::itemCount();
$items = Cart::items();

// Update and manage
Cart::update($cartItem, quantity: 5);
Cart::remove($product, quantity: 1);

// Checkout
$purchases = Cart::checkout();

Benefits

  1. Cleaner Code: No need for auth()->user()->currentCart()->getTotal()
  2. Better Testing: Easy to mock with Cart::shouldReceive()
  3. IDE Support: Static methods provide excellent autocomplete
  4. Consistent Interface: Unified API across the package
  5. Type Safety: All methods are properly type-hinted
  6. Documentation: Methods are self-documenting through type hints

Future Improvements

Consider implementing additional facades:

  • Inventory - For stock management
  • Purchase - For purchase operations
  • Stripe - For payment processing

These were outlined in the FACADE_SUGGESTIONS.md document and can be implemented using the same pattern.

Integration

The facades are automatically registered in the service container through the ShopServiceProvider. They're ready to use immediately after the package is installed:

// No additional configuration needed!
use Blax\Shop\Facades\Shop;
use Blax\Shop\Facades\Cart;

Shop::featured();
Cart::add($product);