Validácia, requesty a kolekcie
Peňažný vstup validujte objektmi pravidiel alebo textovými pravidlami:
use RoundlyConsulting\Money\Rules\CurrencyCode;
use RoundlyConsulting\Money\Rules\MoneyAmount;
$request->validate([
'price' => ['required', MoneyAmount::in('EUR')->positive()->max('99999.99')],
'fee' => [MoneyAmount::inCurrencyFrom('currency')->allowNegative()],
'amount' => [MoneyAmount::in('EUR')->localized('sk')], // accepts "1 234,50"
'currency' => ['required', (new CurrencyCode)->isoOnly()],
'payout' => ['required', new CurrencyCode(['EUR', 'CZK'])],
'legacy' => 'money_amount:EUR',
'code' => 'currency_code:EUR,CZK',
]);- MoneyAmount::in($currency) alebo MoneyAmount::inCurrencyFrom($field) — pevná mena alebo mena zo susedného poľa (obmedzená cez currencies.allowed).
- min() / max() — inty a desatinné reťazce sú celé jednotky; hranica jemnejšia ako mena sa zaokrúhli smerom dovnútra.
- positive() vyžaduje viac ako nulu; allowNegative() zruší predvolenú kontrolu nezápornosti.
- localized(?$locale) — prijme lokalizovaný vstup ako „1 234,50“ cez parser.
- new CurrencyCode(?$allowed) — registrovaný kód obmedzený na $allowed alebo currencies.allowed; ->isoOnly() odmietne vlastné meny.
- Textové pravidlá: currency_code, currency_code:EUR,CZK a money_amount:EUR (bez parametra predvolená mena).
Hlášky sú v money::validation.* — amount, precision, too_large, negative, positive, min, max a currency — v angličtine a slovenčine. Upraviť ich môžete po publikovaní money-translations.
Čítanie sumy z requestu
$price = $request->money('price', 'EUR'); // JSON 1.1 → 1.10 EUR, not 1.11
$fee = $request->money('fee', currencyKey: 'currency'); // currency from another input
$tip = $request->money('tip'); // money.default_currency; null when blank- Chýbajúci alebo prázdny vstup vráti null.
- Int znamená celé jednotky; JSON float sa zmení na najkratší desatinný zápis, ktorý float presne vystihuje, takže 1.1 je 110 centov, nie 111.
- Mena sa berie z argumentu, potom zo vstupu v currencyKey a nakoniec z money.default_currency.
- Sumy nad 2⁵³ posielajte ako JSON reťazce a vopred ich overte cez MoneyAmount.
Kolekcie
$order->items->sumMoney(
fn ($item) => $item->price->multiply($item->quantity),
currencyIfEmpty: 'EUR',
);
$prices->minMoney(); // the items are Money
$products->maxMoney('price'); // a key or property path
$products->avgMoney('price'); // rounds once with money.roundingsumMoney, minMoney, maxMoney a avgMoney fungujú na Collection aj LazyCollection (Eloquent kolekcie ich dedia). Hodnota je null (položky sú Money), kľúč či cesta k vlastnosti alebo callback. Prázdne kolekcie sa správajú ako Money::sum/min/max/average.
API resource
use RoundlyConsulting\Money\Http\Resources\MoneyResource;
return ['price' => MoneyResource::from($product->price)];
// {"minor":"1050","decimal":"10.50","currency":"USD","exponent":2,"formatted":"$10.50"}MoneyResource::from() vráti pre null hodnotu null. Pole formatted používa zaregistrovaný formátovač v lokalite aplikácie a slúži len na zobrazenie — klienti by mali počítať s minor.
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.