Laravel Winkelwagen

Laravel Cart is een zeer aanpasbaar pakket waarmee je eenvoudig winkelwagenfunctionaliteit kunt toevoegen aan je Laravel applicaties. Met flexibele opties voor artikelbeheer, persistente opslag en diepe integratie met Laravel is het perfect voor het bouwen van e-commerce of aangepaste winkelfuncties.

Laravel cart

Total DownloadsLatest Version on Packagist

Kenmerken

  • permanente winkelwagenopslag (database/sessie)
  • ondersteuning voor gasten en geauthenticeerde gebruikers
  • zeer nauwkeurige prijsberekeningen
  • model associaties
  • methode chaining
  • uitzonderingsafhandeling

Installatie

Gebruik Composer om het pakket te installeren:

composer require isapp/laravel-cart

Configuratie publiceren

Om de standaardconfiguratie aan te passen, publiceer je het configuratiebestand met het volgende Artisan commando:

php artisan vendor:publish --provider="Isapp\LaravelCart\CartServiceProvider" --tag="config"

Deze opdracht maakt een config/laravel-cart.php bestand aan waarin je de pakketinstellingen naar wens kunt aanpassen.

Migraties publiceren en uitvoeren

Om de migratiebestanden van het Laravel Cart pakket te publiceren, gebruik je de volgende Artisan opdracht:

php artisan vendor:publish --provider="Isapp\LaravelCart\CartServiceProvider" --tag="migrations"

Dit commando kopieert de migratiebestanden naar de database/migrations map van je project.

De migraties uitvoeren

Zodra de migratiebestanden gepubliceerd zijn, kun je de migraties toepassen op je database met het volgende commando:

php artisan migrate

Aan de slag

Gebruikersbeheer

getUser(): ?Authenticatable

Geeft de huidige geauthenticeerde gebruiker of nul als er geen gebruiker is ingesteld.

$user = Cart::getUser();

setUser(Authenticatable $user): Driver

Stelt een specifieke gebruiker in voor karbewerkingen. Nuttig voor adminbewerkingen of impersonatie.

$user = User::find(1);
Cart::setUser($user)->storeItem($item);

setGuard(string $guard): Driver

Stelt de te gebruiken authenticatiewachter in (standaard is 'web').

Cart::setGuard('admin')->getUser();

Beheer winkelwagen

get(): Model|Cart

Vindt of creëert de winkelwagen voor de huidige gebruiker of sessie. Voor geauthenticeerde gebruikers wordt de winkelwagen gevonden of aangemaakt op user_id. Voor gasten wordt session_id gebruikt.

$cart = Cart::get();
echo "Cart has " . $cart->items->count() . " items";

Item Opslag

storeItem(CartItemContract $item): Driver

Slaat een enkel item op in de winkelwagen. Als het item al bestaat, wordt de hoeveelheid verhoogd.

$product = Product::find(1);
$cartItem = new CartItem();
$cartItem->itemable()->associate($product);
Cart::storeItem($cartItem);

Gooit:

  • NotImplementedException - als itemable CartItemProduct niet implementeert
  • ItemAssociatedWithDifferentCartException - als geprobeerd wordt een item uit een andere winkelwagen toe te voegen

storeItems(Collection $items): static

Slaat meerdere items tegelijk op in de winkelwagen.

$items = collect([
    $cartItem1,
    $cartItem2,
    $cartItem3
]);
Cart::storeItems($items);

Hoeveelheidsbeheer

increaseQuantity(CartItemContract $item, int $quantity = 1): static

Verhoogt de hoeveelheid van een specifiek artikel in de winkelwagen.

// Increase by 1 (default)
Cart::increaseQuantity($cartItem);

// Increase by specific amount
Cart::increaseQuantity($cartItem, 5);

Werpt:

  • NotFoundException - als het item niet bestaat in de winkelwagen

decreaseQuantity(CartItemContract $item, int $quantity = 1): Driver

Verlaagt de hoeveelheid van een specifiek artikel in de winkelwagen.

// Decrease by 1 (default)
Cart::decreaseQuantity($cartItem);

// Decrease by specific amount
Cart::decreaseQuantity($cartItem, 3);

Gooit:

  • NotFoundException - als item niet bestaat in winkelwagen

Item verwijderen

removeItem(CartItemContract $item): Driver

Verwijdert een specifiek item volledig uit de winkelwagen.

Cart::removeItem($cartItem);

emptyCart(): static

Verwijdert alle items uit de winkelwagen.

Cart::emptyCart();

Prijsberekeningen

getItemPrice(CartItemContract $item, bool $incTaxes = true): string

Berekent de totale prijs voor een artikel in de winkelwagen (prijs × hoeveelheid). Geeft een tekenreeks terug voor nauwkeurigheid.

// With taxes (default)
$totalPrice = Cart::getItemPrice($cartItem);

// Without taxes
$totalPrice = Cart::getItemPrice($cartItem, false);

getItemPricePerUnit(CartItemContract $item, bool $incTaxes = true): string

Geeft de prijs per enkele eenheid van een winkelwagenitem.

// With taxes (default)
$unitPrice = Cart::getItemPricePerUnit($cartItem);

// Without taxes
$unitPrice = Cart::getItemPricePerUnit($cartItem, false);

getTotalPrice(bool $incTaxes = true): string

Berekent de totale prijs van alle items in de winkelwagen.

// With taxes (default)
$total = Cart::getTotalPrice();

// Without taxes
$total = Cart::getTotalPrice(false);

Gebruiksvoorbeelden

Basisbewerkingen voor de winkelwagen

use Isapp\LaravelCart\Facades\Cart;
use App\Models\Product;
use Isapp\LaravelCart\Models\CartItem;

// Create and add item to cart
$product = Product::find(1);
$cartItem = new CartItem();
$cartItem->itemable()->associate($product);

Cart::storeItem($cartItem);

// Get cart with items
$cart = Cart::get();
echo "Items in cart: " . $cart->items->count();

// Calculate totals
$total = Cart::getTotalPrice();
echo "Cart total: $" . $total;

Werken met verschillende gebruikers

// Admin adding items to user's cart
$user = User::find(123);
$product = Product::find(1);
$cartItem = new CartItem();
$cartItem->itemable()->associate($product);

Cart::setUser($user)->storeItem($cartItem);

Beheer van aantallen

// Get existing cart item
$cart = Cart::get();
$cartItem = $cart->items->first();

// Increase quantity
Cart::increaseQuantity($cartItem, 2);

// Decrease quantity
Cart::decreaseQuantity($cartItem, 1);

// Remove item completely
Cart::removeItem($cartItem);

Prijsberekeningen

$cart = Cart::get();

foreach ($cart->items as $item) {
    $unitPrice = Cart::getItemPricePerUnit($item);
    $totalItemPrice = Cart::getItemPrice($item);
    
    echo "Unit: $unitPrice, Total: $totalItemPrice\n";
}

$grandTotal = Cart::getTotalPrice();
echo "Grand Total: $grandTotal";

Fout afhandeling

De DatabaseDriver gooit specifieke uitzonderingen weg voor verschillende foutcondities:

use Isapp\LaravelCart\Exceptions\NotFoundException;
use Isapp\LaravelCart\Exceptions\NotImplementedException;
use Isapp\LaravelCart\Exceptions\ItemAssociatedWithDifferentCartException;

try {
    Cart::increaseQuantity($cartItem, 5);
} catch (NotFoundException $e) {
    // Item not found in cart
    return response()->json(['error' => 'Item not found'], 404);
} catch (NotImplementedException $e) {
    // Itemable doesn't implement required interface
    return response()->json(['error' => 'Invalid item'], 400);
} catch (ItemAssociatedWithDifferentCartException $e) {
    // Trying to add item from another cart
    return response()->json(['error' => 'Item belongs to different cart'], 400);
}

Opmerkingen

  • Alle prijsberekeningen gebruiken BCMath voor rekenen met hoge precisie
  • Prijzen worden geretourneerd als strings om de precisie te behouden
  • De driver ondersteunt zowel geauthenticeerde gebruikers als gastsessies
  • Method chaining wordt ondersteund voor vloeiende interface
  • Winkelwagenitems moeten de interface CartItemProduct implementeren
  • De driver gebruikt eager loading om database queries te optimaliseren

Een aangepast stuurprogramma toevoegen aan Laravel Facade via Extend

Als je een eigen stuurprogramma wilt toevoegen aan de Cart façade, kun je dat doen door het uit te breiden binnen een service provider. Hier is een voorbeeld dat laat zien hoe je dit kunt doen:

  1. Maak bijvoorbeeld een aangepaste driverklasse:

    namespace App\Services;
    
    use Isapp\LaravelCart\Contracts\Driver;
    
    class CustomCartDriver implements Driver
    {
        // Implement methods as per the contract and your needs
        public function storeItem(CartItemContract $item): Driver
        {
            // Custom implementation
        }
    
        public function increaseQuantity(CartItemContract $item, int $quantity = 1): static
        {
            // Custom implementation
        }
    
        // Other required methods...
    }
    
  2. Registreer het aangepaste stuurprogramma in een serviceprovider:

    namespace App\Providers;
    
    use Illuminate\Support\ServiceProvider;
    use Isapp\LaravelCart\Facades\Cart;
    
    class CartServiceProvider extends ServiceProvider
    {
        public function boot()
        {
            Cart::extend('custom', function () {
                return new \App\Services\CustomCartDriver;
            });
        }
    }
    

ToDo Lijst

  • Automatisch opschonen voor verlopen kaartsessies toevoegen
  • Methode toevoegen om totaal aantal items in winkelwagen te krijgen
  • Methode toevoegen om de totale hoeveelheid van alle items op te vragen
  • Methode toevoegen om item op ID te vinden
  • Methode toevoegen om te controleren of een bepaald item bestaat in het winkelwagentje
  • Voorraadvalidatie toevoegen voordat items worden toegevoegd
  • Gebeurtenissen afvuren toevoegen (ItemBijgevoegd, ItemVerwijderd, enz.)
  • Methode toevoegen om wagens samen te voegen (gast → gebruiker)

Bijdragen aan

Bijdragen zijn welkom! Als je suggesties hebt voor verbeteringen, nieuwe functies of problemen vindt, voel je dan vrij om een pull request in te dienen of een probleem te openen in deze repository.

Bedankt voor je hulp om dit pakket beter te maken voor de gemeenschap!

Licentie

Dit project is open-sourced software gelicenseerd onder de MIT Licentie.

Je bent vrij om het te gebruiken, aan te passen en te verspreiden in je projecten, zolang je voldoet aan de voorwaarden van de licentie.