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

Modely a trait vlastníka

Purchase, PurchaseItem, Subscription, SubscriptionItem, PurchaseRefund a PurchaseNotification (v RoundlyConsulting\Purchases\Models) sú štandardné Eloquent modely so soft delete a factory.

Nákupy jedného vlastníka

Purchases::for($owner) nepotrebuje na modeli žiadny trait — obmedzí dopyty presne na morph typ a kľúč daného vlastníka:

use RoundlyConsulting\Purchases\Facades\Purchases;

Purchases::for($user)->subscribedTo('pro');            // bool
Purchases::for($user)->activeSubscription('pro');      // ?Subscription (latest active)
Purchases::for($user)->purchases()->latest()->get();   // Builder<Purchase>
Purchases::for($user)->subscriptions()->count();       // Builder<Subscription>

Trait HasPurchases

Pridajte trait do modelu vlastníka — zvyčajne User — a získate vzťahy purchases a subscriptions cez polymorfný vzťah owner. Jeho pomocníky activeSubscription() a subscribedTo() sú len skratkou pre Purchases::for($this), takže sa správajú presne ako fasáda:

use RoundlyConsulting\Purchases\Concerns\HasPurchases;

class User extends Authenticatable
{
    use HasPurchases;
}

$user->purchases;                    // MorphMany<Purchase>
$user->subscriptions;                // MorphMany<Subscription>
$user->activeSubscription();         // ?Subscription — the latest active one
$user->activeSubscription('pro');    // ?Subscription — by plan name
$user->subscribedTo('pro');          // bool — both delegate to Purchases::for($this)

Scopy a pomocníky predplatného

use RoundlyConsulting\Purchases\Models\Subscription;

Subscription::active()->expiring(7)->get();   // active and ending within 7 days
Subscription::trialing()->get();
Subscription::canceled()->get();

$subscription->isActive();          // entitled and not past ends_at
$subscription->onTrial();
$subscription->daysUntilRenewal();  // ?int
$subscription->isExpiring(7);
$subscription->items;               // HasMany<SubscriptionItem>
  • active() — stav Completed alebo InGracePeriod a ends_at prázdne alebo v budúcnosti.
  • trialing() — trial_ends_at v budúcnosti.
  • expiring($days = 7) — ends_at v priebehu najbližších $days dní.
  • canceled() — stav Canceled.
  • daysUntilRenewal() — celé dni do ends_at (nikdy záporné), alebo null bez dátumu konca.

Scopy poskytovateľa a vzťahy

Purchase, Subscription a PurchaseRefund zdieľajú forProvider(), byProviderId() a byTransaction(); PurchaseRefund pridáva chargebacks() a PurchaseNotification pridáva pending():

use RoundlyConsulting\Purchases\Models\Purchase;
use RoundlyConsulting\Purchases\Models\PurchaseNotification;
use RoundlyConsulting\Purchases\Models\PurchaseRefund;

Purchase::forProvider('stripe')->byProviderId('pi_123')->first();
Purchase::byTransaction('2000000000000001')->first();
PurchaseRefund::forProvider('google')->chargebacks()->get();
PurchaseNotification::forProvider('apple')->pending()->get();

$purchase->owner;     // MorphTo — your User (or null)
$purchase->items;     // HasMany<PurchaseItem>
$purchase->refunds;   // HasMany<PurchaseRefund>
$purchase->meta;      // Collection — the raw store payload
$refund->purchase;    // BelongsTo<Purchase>

Výmena modelov

Každý model sa dá vymeniť cez config('purchases.models.*'). Vaša trieda musí byť modelom balíka, ktorý nahrádza, alebo z neho dediť — akákoľvek iná trieda vyhodí InvalidConfigurationException s názvom kľúča namiesto toho, aby sa potichu použil model balíka:

// app/Models/Purchase.php
namespace App\Models;

use RoundlyConsulting\Purchases\Models\Purchase as BasePurchase;

class Purchase extends BasePurchase
{
    // your relations, accessors, casts …
}

// config/purchases.php
'models' => [
    'purchase' => \App\Models\Purchase::class,
    // …
],

Schéma

TabuľkaStĺpce
purchasesowner (voliteľný morph), provider, provider_id, transaction_id, status, price + price_currency, meta, last_event_at — unikátne (provider, provider_id)
purchase_itemspurchase_id (kaskádové mazanie), provider_id, name, price + price_currency, quantity
subscriptionsowner (voliteľný morph), provider, provider_id, transaction_id, name, status, price + price_currency, active_from, trial_ends_at, ends_at, meta, last_event_at — unikátne (provider, provider_id)
subscription_itemssubscription_id (kaskádové mazanie), provider_id, name, price + price_currency
purchase_refundspurchase_id (voliteľné), provider, provider_id, transaction_id, reason, chargeback, price + price_currency, refunded_at, meta, last_event_at — unikátne (provider, provider_id)
purchase_notificationsprovider, type, signature_verified, payload, processed_at

Každá tabuľka má timestamps a soft deletes. Názvy tabuliek pochádzajú z getTable() každého modelu, takže vymenený model s vlastným $table sa zmigruje pod týmto názvom — nastavte ho pred spustením migrácií.

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.