Fasáda OpeningHours
Všetko ide cez fasádu OpeningHours nad RoundlyConsulting\OpeningHours\OpeningHoursManager — je to odporúčaný spôsob použitia. Manažér je registrovaný ako scoped (jedno memo na request alebo job) a má globálny alias OpeningHours (config facade_alias). Metódy traitu vlastníka sú skratky k tým istým volaniam — $clinic->setOpeningHours() je OpeningHours::sync($clinic):
use RoundlyConsulting\OpeningHours\DataTransferObjects\ExceptionData;
use RoundlyConsulting\OpeningHours\Facades\OpeningHours;
OpeningHours::sync($clinic, ['week' => ['monday' => ['09:00-17:00']]]); // replace the whole definition
OpeningHours::for($clinic)->isOpen(); // the query object
OpeningHours::edit($clinic)->closed('2026-12-24')->save(); // builder, optimistic save
// One exception at a time — locked, validated against the whole definition, never stale:
OpeningHours::exceptions($clinic)->closed('2026-12-24', label: 'Christmas Eve');
OpeningHours::exceptions($clinic)->open('2026-12-31', ['09:00-13:00']);
OpeningHours::exceptions($clinic, 'pickup')->add(ExceptionData::make('12-26', label: 'St Stephen'));
OpeningHours::exceptions($clinic)->all(); // list<ExceptionData>, with ids
OpeningHours::exceptions($clinic)->remove($ruleId); // false for another calendar's rule
OpeningHours::delete($clinic); // soft; the next sync restores it
OpeningHours::delete($clinic, 'pickup', force: true); // gone for goodAk vlastník pod daným kľúčom nemá živý kalendár, zápis výnimky vyhodí CalendarNotFoundException — kalendár najprv vytvorte cez sync(). delete() je predvolene soft, takže ďalší sync kalendár obnoví; force: true ho odstráni natrvalo, aj keď už je soft-deleted.
Všetky metódy
| Metóda | Účel |
|---|---|
for($owner, ?$calendar) | Dotazovací objekt — rovnako ako $owner->openingHours(). |
calendar($owner, ?$calendar) | Živá hlavička ?Calendar (null pre neuloženého vlastníka). |
has($owner, ?$calendar) | Či kalendár existuje. |
edit($owner, ?$calendar) | CalendarBuilder naplnený aktuálnou definíciou. |
sync($owner, $data, ?$calendar, ?$expectedRevision) | Úplné nahradenie; vstup v poli sa najprv parsuje a validuje. |
make($data, ?$timezone) | OpeningHours v pamäti — bez databázy. |
exceptions($owner, ?$calendar) | Handle CalendarExceptions — closed(), open(), add(), all(), remove() — na zápis jednotlivých výnimiek bezpečný pri súbežnosti. |
delete($owner, ?$calendar, force: false) | Predvolene soft delete (ďalší sync ho obnoví); force: true ho odstráni natrvalo, aj keď už je soft-deleted; false, ak neexistuje. |
refresh($owner, ?$calendar) | Zvýši revíziu po raw SQL alebo zmene hooku časového pásma. |
validate($payload, ?$options) | ViolationList — nič sa nezapíše. |
definitionData($calendar) | Uložená definícia hlavičky Calendar ako CalendarData, cez memo a cache. |
flushMemo() | Vyprázdni memo v rámci requestu. |
fake() | Nahradí manažéra zaznamenávajúcim OpeningHoursFake — pozrite Testovanie. |
Dve triedy s názvom OpeningHours
Dotazovací objekt má rovnaký krátky názov ako fasáda — ak súbor potrebuje oba, jeden z nich aliasujte:
use RoundlyConsulting\OpeningHours\Facades\OpeningHours as Hours;
use RoundlyConsulting\OpeningHours\OpeningHours;
Hours::for($clinic, 'pickup')->forWeek()->grouped();
Hours::has($clinic, 'pickup');
Hours::validate($request->input('hours', []))->toMessageBag('hours');
$preview = OpeningHours::make(['week' => ['saturday' => ['22:00-03:00']]], 'Europe/Bratislava');Chcete rovnaké API bez statických volaní? Pozrite si časť DI a akcie.
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.