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í:
| Akcia | Signatúra | Správanie |
|---|---|---|
AddToCartAction | execute(Cart $cart, ProductVariant $variant, int $quantity = 1): CartItem | Za cart()->add() aj $cart->add(); beží pod zámkom riadku košíka, takže dvojklik na pridanie skončí v jednom riadku. |
UpdateCartItemAction | execute(Cart $cart, CartItem $item, int $quantity): ?CartItem | Nastaví 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. |
RemoveFromCartAction | execute(Cart $cart, CartItem $item): void | Riadok soft-deletne; riadok iného košíka vyhodí ForeignItemException. |
ClearCartAction | execute(Cart $cart): Cart | Soft-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 lineMnož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]); // InvalidQuantityExceptionPrejavte 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 kryptomienOdoslaní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.