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.
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 implementeertItemAssociatedWithDifferentCartException
- 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:
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... }
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.