DI a akcie
Fasáda je odporúčaná voľba, nie jediná cesta. Balík ponúka tri rovnocenné vstupné body a všetky spúšťajú ten istý kód:
- Fasáda Coupons — najkratší zápis, odporúčaný na bežné volania.
- Manažér RoundlyConsulting\Coupons\CouponManager — koreň fasády. Injektujte ho cez konštruktor a získate rovnaké API ako explicitnú závislosť, bez statických volaní.
- Akcie — jednoúčelové triedy v RoundlyConsulting\Coupons\Actions s jedinou metódou execute(), ktoré skladáte do vlastných akcií, jobov a príkazov.
Injektovanie manažéra
use RoundlyConsulting\Coupons\CouponManager;
use RoundlyConsulting\Coupons\DataTransferObjects\RedemptionResult;
use RoundlyConsulting\Money\Money;
final class ApplyCoupon
{
public function __construct(private CouponManager $coupons) {}
public function __invoke(string $code, Money $cart, User $user): RedemptionResult
{
return $this->coupons->code($code)->redeem($cart, $user);
}
}Coupons::fake() nahradí manažéra pre fasádu aj pre každý injektovaný CouponManager — manažér nie je final, aby ho fake mohol rozšíriť —, takže triedu s injektovaným manažérom testujete rovnako ako triedu, ktorá volá fasádu.
Spustenie akcie
Každá operácia je aj samostatná trieda akcie, ktorú si môžete vyžiadať z kontajnera a spustiť sami. Väčšina berie bežné argumenty; CreateCouponAction berie DTO CreateCouponData a RedeemCouponAction DTO RedeemCouponData:
use RoundlyConsulting\Coupons\Actions\{CheckCouponAction, CreateCouponAction, ExpireCouponsAction,
PruneCouponsAction, RedeemCouponAction, RevokeCouponAction};
use RoundlyConsulting\Coupons\DataTransferObjects\RedeemCouponData;
app(CreateCouponAction::class)->execute($data); // Coupon; quiet: true skips CouponCreated
app(CheckCouponAction::class)->execute('SUMMER', $cart, $user); // ?RedemptionFailureReason
app(RedeemCouponAction::class)->execute(new RedeemCouponData(coupon: 'SUMMER', price: $cart, redeemer: $user));
app(RevokeCouponAction::class)->execute($coupon);
app(ExpireCouponsAction::class)->execute(); // int
app(PruneCouponsAction::class)->execute(days: 30, force: false); // intManažér si akciu vyžiada z kontajnera až pri volaní metódy. Akcia, ktorú spustíte sami, manažéra obíde, takže ju Coupons::fake() nezaznamená — v testoch preto overujte databázu a udalosti. Model Coupon, trait HasCoupons, pravidlo Redeemable aj oba Artisan príkazy idú cez manažéra.
Metóda fasády → akcia
| Metóda fasády | Akcia | Poznámka |
|---|---|---|
generate(), create() | CreateCouponAction | Berie DTO CreateCouponData; generate() ho zostaví za vás. |
createQuietly() | CreateCouponAction | execute($data, quiet: true) — bez CouponCreated. |
check() | CheckCouponAction | execute($coupon, $price, $redeemer) — nevyhadzuje výnimky, nezamyká ani nezapisuje. |
redeem() | RedeemCouponAction | Berie DTO RedeemCouponData (coupon, price, redeemer). |
revoke() | RevokeCouponAction | Berie model Coupon; kód najprv prevedie na model manažér. |
expireAll() | ExpireCouponsAction | execute(?string $code = null): int |
prune() | PruneCouponsAction | execute(int $days = 30, bool $force = false): int |
preview() | — | Coupon::previewDiscount() nad nájdeným modelom. |
find(), findOrFail(), exists(), redeemable() | — | Dopyt nad modelom nastaveným v coupons.model. |
code() | — | Handle CouponCode nad check(), preview(), redeem() a revoke(). |
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 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.