DI a akcie
Fasáda je najkratšia cesta a odporúčaná voľba, no je len jedným z troch rovnocenných vstupných bodov — vyberte si ten, ktorý sa hodí ku kódu, ktorý práve píšete:
- Fasáda Appointments — statické volania, najmenej kódu.
- Manažér — RoundlyConsulting\Appointments\AppointmentManager, koreň fasády. Injektujte ho cez konštruktor a získate identické API ako explicitnú závislosť, bez statických volaní.
- Akcie — jednoúčelové triedy s metódou execute(), ktoré skladáte do vlastných akcií, úloh vo fronte a príkazov.
Injektovanie manažéra
use RoundlyConsulting\Appointments\AppointmentManager;
final class BookingController
{
public function __construct(private AppointmentManager $appointments) {}
public function store(): void
{
$appointment = $this->appointments->schedule('Consultation')->startingAt(now()->addDay())->create();
$this->appointments->for($appointment)->participants()->add(auth()->user());
}
}Appointments::fake() podstrčí fake za fasádu aj do kontajnera, takže fake dostane aj injektovaný AppointmentManager. Manažér zámerne nie je final, aby ho fake mohol rozšíriť.
Spustenie akcie
Získajte akciu z kontajnera a zavolajte execute() — z úlohy vo fronte, z príkazu alebo z vlastnej akcie:
use RoundlyConsulting\Appointments\Actions\AttachParticipantAction;
use RoundlyConsulting\Appointments\Actions\CreateAppointmentAction;
use RoundlyConsulting\Appointments\Actions\DetachParticipantAction;
use RoundlyConsulting\Appointments\Actions\RescheduleAppointmentAction;
use RoundlyConsulting\Appointments\Actions\ScheduleRecurringAppointmentAction;
use RoundlyConsulting\Appointments\Actions\TransitionAppointmentAction;
use RoundlyConsulting\Appointments\DataTransferObjects\ParticipantData;
use RoundlyConsulting\Appointments\Enums\Status;
$appointment = app(CreateAppointmentAction::class)->execute($appointmentData);
app(AttachParticipantAction::class)->execute($appointment, new ParticipantData($user), preventConflicts: true);
app(DetachParticipantAction::class)->execute($appointment, $user);
app(RescheduleAppointmentAction::class)->execute($appointment, $newStart, durationMinutes: 45);
app(TransitionAppointmentAction::class)->execute($appointment, Status::Confirmed);
app(ScheduleRecurringAppointmentAction::class)->execute($appointmentData, $rule);Priamo volané akcie Appointments::fake() obchádzajú; fasáda, injektovaný manažér ani skratky na modeli nie.
Metóda fasády → akcia
| Metóda fasády | Akcia |
|---|---|
create() · schedule()->…->create() | CreateAppointmentAction |
createRecurring() · schedule()->…->createRecurring() | ScheduleRecurringAppointmentAction (bez pravidla CreateAppointmentAction) |
for($a)->reschedule() | RescheduleAppointmentAction |
for($a)->transition() · confirm() · cancel() · complete() · decline() · markNoShow() | TransitionAppointmentAction |
for($a)->participants()->add() | AttachParticipantAction |
for($a)->participants()->remove() | DetachParticipantAction |
conflicts() · isAvailable() · ics() · occurrences() | — len čítanie, bez akcie |
- CreateAppointmentAction — odmietne duplicitných účastníkov a potom v jednej transakcii uzamkne účastníkov a skontroluje konflikty (ak sú zakázané), uloží termín v UTC spolu s jeho pásmom, pripojí účastníkov a kontakty, otvorí žiadosť o schválenie a vráti termín s načítanými účastníkmi.
- ScheduleRecurringAppointmentAction — rozvinie pravidlo v pásme termínu a v jednej transakcii vytvorí všetky výskyty so spoločnou recurrence_group.
- RescheduleAppointmentAction — presunie začiatok, ponechá trvanie, ak nezadáte nové, a spustí AppointmentRescheduled; pri zakázaných konfliktoch najprv uzamkne termín aj jeho účastníkov.
- TransitionAppointmentAction — overí a vykoná zmenu stavu a spustí AppointmentStatusChanged.
- AttachParticipantAction — pridá jedného účastníka za kontrolou duplicít a voliteľnou kontrolou konfliktov; skôr odobraného účastníka obnoví namiesto nového vloženia.
- DetachParticipantAction — cez soft delete odoberie účastníka podľa modelu alebo podľa riadka daného termínu; pri čomkoľvek inom vyhodí ParticipantNotFoundException.
Verejné metódy manažéra rescheduleFor(), transitionFor(), addParticipantFor() a removeParticipantFor() sú @internal — tvoria telo metód handlu a sú jediným miestom, ktoré fake prepisuje. Volajte namiesto nich handle for().
create(), createRecurring() aj všetky akcie prijímajú typované DTO opísané v časti Typované DTO.
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.