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

Obchody a tenancy

Shop je konkrétny tenant, ku ktorému patrí každý vlastnený záznam cez obyčajný cudzí kľúč shop_id s možnou hodnotou null. Aplikácia s jedným obchodom ho môže úplne ignorovať; aplikácia s viacerými obchodmi ich vytvára a dáta k nim priraďuje:

use RoundlyConsulting\Shops\Facades\Shops;
use RoundlyConsulting\Shops\Products\Product;
use RoundlyConsulting\Shops\Shops\Shop;

$shop = Shop::create(['name' => 'Acme EU', 'currency' => 'EUR']);
$shop->currency();   // Currency (EUR) — the shop's own, or the configured default when null

// Explicit ownership always wins:
$product = Product::create(['shop_id' => $shop->id, 'name' => 'Sparkling Water']);

// Or bind a current shop and let shop_id auto-fill on create:
Shops::current()->set($shop);                        // a Shop or its id
Product::create(['name' => 'Still Water']);          // shop_id auto-filled
Shops::current()->id();                              // ?int
Shops::current()->forget();

// Scoped block — restores the previous binding afterwards (even on exception):
Shops::current()->run($shop, function () {
    Product::create(['name' => 'Tonic']);            // belongs to $shop
});

Shops::current()->get();                             // ?Shop bound to the current context
Shop::current();                                     // the same, typed to the package's Shop model

Product::query()->forShop($shop)->get();             // scope by model
Product::query()->forShop($shop->id)->get();         // or by id

Model Shop

Shop má preložiteľný názov a slug, voliteľnú menu ISO a soft deletes. Jeho slug je jedinečný naprieč všetkými obchodmi a slúži ako route key:

$shop->setTranslation('name', 'sk', 'Acme EU (SK)')->save();

$shop->products();     // HasMany<Product>  — also what ->scopeBindings() walks
$shop->categories();   // HasMany<Category> — ditto
$shop->taxRates();     // HasMany<TaxRate>
$shop->currency();     // Currency — the shop's, else shops.pricing.default_currency
$shop->currentSlug();  // sluggable readers: slugMap(), slugFor($locale)

Shop::resolveModelClass();   // the configured shops.shop_model class
Shop::current();             // ?Shop — the CurrentShop binding, only when it is a Shop

CurrentShop

Shops::current() vracia CurrentShop, ktorý drží aktívneho tenanta. Je naviazaný pre každý request a každý job vo fronte (scoped väzba): Octane ho medzi requestmi zahodí a worker fronty pred každým jobom, takže tenant jedného nikdy neprenikne do ďalšieho. Nič ho za vás nenastaví — nastavte ho vo vlastnom middlewari, na začiatku jobu alebo v ohraničenom bloku. Bez fasády zavolajte ->current() na injektovanom ShopsManager alebo si vyžiadajte priamo CurrentShop:

MetódaPopis
set(Model|int|null $shop): voidNaviaže model alebo kľúč.
get(): ?ModelNaviazaný model; naviazaný kľúč sa načíta raz.
id(): ?intNaviazaný kľúč.
forget(): voidZruší väzbu.
run(Model|int $shop, Closure $callback): mixedNaviaže obchod na dobu callbacku, potom obnoví predošlú väzbu (aj pri výnimke) a vráti hodnotu callbacku.
use Closure;
use Illuminate\Http\Request;
use RoundlyConsulting\Shops\Facades\Shops;

final class SetCurrentShop
{
    public function handle(Request $request, Closure $next)
    {
        Shops::current()->set($request->route('shop'));   // a model or a key

        return $next($request);
    }
}

// In a queued job or console command, scope the work instead:
$product = Shops::current()->run($shop, fn () => Product::create(['name' => 'Chair']));

BelongsToShop

  • Používajú ho Product, Category, Cart, Order a položka objednávky Item. TaxRate má vlastnú reláciu shop().
  • Pri vytváraní sa prázdne shop_id vyplní z CurrentShop. Explicitné shop_id má vždy prednosť; ak nie je nič naviazané, nič sa nevyplní.
  • shop() — BelongsTo na nakonfigurovaný model tenanta; forShop($shopOrId) — podmienka na shop_id.
  • Varianty, možnosti, pohyby zásob a položky košíka patria pod svojho rodiča a shop_id nemajú.

Vlastný model tenanta

shops.shop_model prijme ľubovoľný Eloquent model — vlastnené záznamy potrebujú len jeho primárny kľúč. Funkcie, ktoré potrebujú Shop z balíka (Shop::current(), mena obchodu, databázové sadzby daní obchodu, kontext obchodu pri cene košíka a objednávky), fungujú len vtedy, keď je tenant Shop alebo jeho podtrieda; inak platí predvolená mena a daňové triedy z konfigurácie. Rozšírením Shop si ich zachováte všetky:

use RoundlyConsulting\Shops\Shops\Shop;

// Extend the packaged model to keep currency, tax rates, translations,
// slugs and Shop::current():
class Store extends Shop
{
    // your own relations and helpers
}

// config/shops.php
'shop_model' => App\Models\Store::class,

Publikované migrácie viažu každé shop_id na tabuľku shops. Model tenanta nad inou tabuľkou vyžaduje úpravu týchto cudzích kľúčov v publikovaných migráciách.

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.