NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky

Cart je perzistentný košík s voliteľným polymorfným vlastníkom (používateľom) alebo tokenom hosťa a vlastnou menou. Pridávajte varianty a cenu čítajte tým istým výpočtom, aký používajú objednávky:

use Illuminate\Support\Str;
use RoundlyConsulting\Shops\Cart\Cart;
use RoundlyConsulting\Shops\Facades\Shops;

// A signed-in customer's cart:
$cart = Cart::create([
    'currency' => 'EUR',
    'owner_type' => $user->getMorphClass(),
    'owner_id' => $user->id,
]);

// A guest cart, found again by its token (the package ships no cart-merge logic):
$guest = Cart::create(['currency' => 'EUR', 'token' => (string) Str::uuid()]);
$guest = Cart::where('token', $token)->first();

$item = Shops::cart($cart)->add($variant, 2);   // snapshots name/sku/price/tax class; same variant increments
$cart->add($variant);                          // the same, as a model method

Shops::cart($cart)->update($item, 3);          // set a line's quantity
Shops::cart($cart)->update($item, 0);          // 0 removes the line (returns null)
Shops::cart($cart)->remove($item);
Shops::cart($cart)->clear();                   // every line; the cart itself stays

$cart->items;                                  // Collection<CartItem>
Shops::cart($cart)->subtotal();                // Money — sum of line totals, before discount
Shops::cart($cart)->price();                   // Price DTO — using the stored coupon_code
Shops::cart($cart)->price('WELCOME10');        // Price DTO — preview another code
$cart->update(['coupon_code' => 'WELCOME10']);

$cart->owner;                                  // ?Model
$cart->isGuest();                              // true when owner_id is null
  • add() zafixuje názov variantu (alebo produktu, ak variant názov nemá), SKU, cenu a daňovú triedu. Opätovné pridanie toho istého variantu zvýši množstvo existujúceho riadku. $cart->add() je to isté volanie ako metóda modelu.
  • Počas pridávania riadku je riadok košíka zamknutý, takže dvojklik na pridanie skončí v jednom riadku.
  • Variant s cenou v inej mene vyhodí CurrencyMismatch a košík zostane nezmenený.
  • update() a remove() odmietnu riadok iného košíka výnimkou ForeignItemException skôr, než sa čokoľvek zapíše.
  • price() použije shops.pricing.price_type, obchod košíka na vyhľadanie dane, žiadnu krajinu, nulovú dopravu a zľavu z naviazaného DiscountResolver. Nikdy nezaznamená uplatnenie kupónu.
  • add(), update() a remove() zahodia načítanú reláciu items, takže ďalšie price() či subtotal() zmenu už uvidí.

Akcie košíka

Handle volá tieto akcie z menného priestoru RoundlyConsulting\Shops\Actions\Cart. Košík je vždy prvý argument a kontrola cudzieho riadku je priamo v akciách, takže platí aj pri ich priamom volaní:

AkciaSignatúraSprávanie
AddToCartActionexecute(Cart $cart, ProductVariant $variant, int $quantity = 1): CartItemZa cart()->add() aj $cart->add(); beží pod zámkom riadku košíka, takže dvojklik na pridanie skončí v jednom riadku.
UpdateCartItemActionexecute(Cart $cart, CartItem $item, int $quantity): ?CartItemNastaví množstvo; 0 riadok zmaže a vráti null; záporné alebo nad maximum vyhodí výnimku; riadok iného košíka vyhodí ForeignItemException.
RemoveFromCartActionexecute(Cart $cart, CartItem $item): voidRiadok soft-deletne; riadok iného košíka vyhodí ForeignItemException.
ClearCartActionexecute(Cart $cart): CartSoft-deletne všetky riadky a vráti obnovený košík.
use RoundlyConsulting\Shops\Actions\Cart\AddToCartAction;
use RoundlyConsulting\Shops\Actions\Cart\ClearCartAction;
use RoundlyConsulting\Shops\Actions\Cart\RemoveFromCartAction;
use RoundlyConsulting\Shops\Actions\Cart\UpdateCartItemAction;

$item = app(AddToCartAction::class)->execute($cart, $variant, 2);   // CartItem

app(UpdateCartItemAction::class)->execute($cart, $item, 3);   // the cart comes first
app(UpdateCartItemAction::class)->execute($cart, $item, 0);   // 0 removes the line (returns null)
app(RemoveFromCartAction::class)->execute($cart, $item);      // or remove it explicitly
app(ClearCartAction::class)->execute($cart);                  // remove every line, returns the fresh cart

Shops::cart($otherCart)->update($item, 2);                    // ForeignItemException — not that cart's line

Množstvá

Množstvo je celý počet kusov od 1 do 32 767 (Support\Quantity::MAX, rozsah stĺpcov množstva). Čokoľvek iné — nula alebo záporné číslo v add() či pri vytvorení objednávky, záporné číslo v update(), zlomok alebo riadok, ktorý by prekročil maximum — vyhodí InvalidQuantityException skôr, než sa čokoľvek zapíše. CartItem aj položka objednávky Item strážia množstvo aj pri každom zápise:

use RoundlyConsulting\Shops\Support\Quantity;

Quantity::MAX;                            // 32767 — the range of the quantity columns

Shops::cart($cart)->add($variant, 0);     // InvalidQuantityException
Shops::cart($cart)->update($item, -1);    // InvalidQuantityException
$item->update(['quantity' => '3']);       // integer strings (request input) are accepted
$item->update(['quantity' => 1.5]);       // InvalidQuantityException

Prejavte lásku k open source

Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.

Ďalšie spôsoby podpory vrátane kryptomien

Odoslaním daru súhlasíte s našimi podmienkami prijímania darov.

Chcete to zabudovať do svojho produktu?

Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.