Vytváranie a úprava reklám
Metódy create aj update prijímajú AdvertisementData. Povinný je len name; price je nepovinný RoundlyConsulting\Money\Money (reklama bez ceny odovzdá price: null alebo ho vynechá). Pri vytvorení je vynechaný argument jednoducho prázdny, pri úprave znamená „ponechať uloženú hodnotu“:
use Illuminate\Support\Collection;
use RoundlyConsulting\Advertisements\DataTransferObjects\AdvertisementData;
use RoundlyConsulting\Advertisements\Facades\Advertisements;
use RoundlyConsulting\Money\Money;
$ad = Advertisements::create(new AdvertisementData(
name: 'Vintage road bike',
price: Money::ofMinor(25000, 'EUR'), // 250.00 EUR
category: $bikesCategory, // a Category model, an id, or a slug — resolved to category_id
description: 'Lightly used, great condition.',
author: $user, // any Eloquent model (polymorphic author)
meta: new Collection(['featured' => true]),
publishedAt: now(),
expiresAt: now()->addMonth(),
)); // → AdvertisementCreated| Argument | Typ | Uloženie |
|---|---|---|
name | string | Povinné. Uloží sa pod aktívny jazyk a pre každý jazyk sa z neho vytvorí slug. |
price | ?Money | Suma v price (najmenšie jednotky), kód v currency. Pri reklame bez ceny ho vynechajte. |
category | Category|int|string|null | Model, id alebo slug, preložený na category_id; neznámy slug znamená null. |
description | ?string | Uloží sa pod aktívny jazyk. |
author | ?Model | Ľubovoľný Eloquent model — polymorfný autor. |
meta | ?Collection | Ľubovoľné doplnkové údaje uložené ako JSON. |
publishedAt | ?CarbonInterface | published_at. |
expiresAt | ?CarbonInterface | expires_at. |
create() spustí AdvertisementCreated. Ak zadáte publishedAt, reklama bude od toho okamihu zverejnená (alebo naplánovaná) — accessor stavu aj scopy čítajú dátumy — no AdvertisementPublished spúšťa len publish(). Ak na tejto udalosti závisia listenery, zavolajte ho.
Presné továrne na cenu
Alebo použite továreň, ktorá pomenúva jednotku a menu predvolí podľa default_currency. Ani jedna neprijíma float:
// Minor units (cents): an int or an integer string — wider than int64 is fine.
$data = AdvertisementData::fromMinor(name: 'Vintage road bike', minor: 25000); // 250.00 EUR
$data = AdvertisementData::fromMinor(name: 'Bike', minor: '00199', currency: 'USD'); // 1.99 USD
// Decimal major units: exact, exponent-aware, never rounded.
$data = AdvertisementData::fromDecimal(name: 'Bike', amount: '1.10'); // 110 cents
$data = AdvertisementData::fromDecimal(name: 'Bike', amount: '1500', currency: 'JPY'); // 1500 yen
AdvertisementData::fromDecimal(name: 'Bike', amount: '19.999'); // throws RoundingNecessary
// A price-less ad: the constructor with no price
$data = new AdvertisementData(name: 'Free to a good home');Obe prijímajú rovnaké voliteľné argumenty category, description, author, meta, publishedAt a expiresAt ako konštruktor.
Z požiadavky
Validujte pravidlami balíka money a cenu načítajte cez Request::money() — JSON float (1.1) prevedie presne, zatiaľ čo (int) ceil($request->float('price') * 100) uloží 1.10 ako 1.11:
use RoundlyConsulting\Advertisements\DataTransferObjects\AdvertisementData;
use RoundlyConsulting\Money\Rules\{CurrencyCode, MoneyAmount};
$request->validate([
'price' => ['required', MoneyAmount::inCurrencyFrom('currency')->min('0')],
'currency' => ['required', new CurrencyCode],
]);
// Preferred — JSON or form bodies:
$data = new AdvertisementData(
name: (string) $request->string('name'),
price: $request->money('price', currencyKey: 'currency'),
);
// Form-encoded input only (the value is already a string):
$data = AdvertisementData::fromDecimal(
name: (string) $request->string('name'),
amount: (string) $request->string('price'),
currency: (string) $request->string('currency'),
);Úprava
$ad = Advertisements::update($ad, new AdvertisementData(
name: 'Vintage road bike (reduced)',
price: Money::ofMinor(19900, 'EUR'),
)); // → AdvertisementUpdatedupdate() zmení len polia, ktoré odovzdáte. name je vždy povinné; každý vynechaný argument si ponechá uloženú hodnotu reklamy, takže zníženie ceny vyššie nezmení popis, kategóriu, meta, autora, umiestnenia ani dátumy publishedAt / expiresAt — a živá reklama zostane živá.
- Ak chcete pole vymazať, odovzdajte ho výslovne ako null: author: null odpojí autora, category: null zruší kategóriu, publishedAt: null vráti reklamu do konceptu.
- Rovnaké pravidlo platí aj pre voliteľné argumenty fromMinor() a fromDecimal().
- name a description sa zapíšu pod aktívny jazyk; ostatné jazyky si hodnoty ponechajú.
- Cena v inej mene reklamu prevedie do tejto meny (akcia najprv zapíše stĺpec currency); price: null vymaže sumu a currency ponechá.
- AdvertisementData::provides($field) povie, či bolo voliteľné pole odovzdané — výslovné null sa počíta.
// Pass an argument as an explicit null to clear it
$ad = Advertisements::update($ad, new AdvertisementData(
name: $ad->name,
author: null, // dissociates the author
category: null, // uncategorises the ad
publishedAt: null, // back to draft
));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.