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 idModel 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 ShopCurrentShop
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óda | Popis |
|---|---|
set(Model|int|null $shop): void | Naviaže model alebo kľúč. |
get(): ?Model | Naviazaný model; naviazaný kľúč sa načíta raz. |
id(): ?int | Naviazaný kľúč. |
forget(): void | Zruší väzbu. |
run(Model|int $shop, Closure $callback): mixed | Naviaž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 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.