bytespin/console-command-scheduler-bundle
ByteSpin Console Command Scheduler is a Symfony 6.3+ bundle for scheduling console commands via Messenger Scheduler, logging execution time, duration and return codes to database and log files, with an EasyAdmin interface and extendable email notifications.
SchedulerEntryFaultedEvent, a bytespin:scheduler:lint CI command, and missed-run semantics) directly support a "scheduling is safe to trust unattended" OKR and are the strongest reason to adopt over hand-rolling.Consider adoption when all of the following hold:
messenger:consume worker.doctrine:schema:update --force (and repeat it on upgrades, since no Doctrine recipe exists).bytespin:scheduler:lint into CI or your deploy pipeline.Look elsewhere or build in-house when:
DashboardController and menu wiring.auto_mapping: true breaks the bundle's getManagerForClass() resolution; you must hand-map every entity. Non-trivial for large legacy apps.For executives (30 seconds): We can add a self-service scheduling console to our Symfony app in days instead of weeks. Operators get a UI to schedule and toggle recurring commands, with execution history, logs, and email alerts; engineering gets validated inputs and a CI check that prevents a bad schedule from taking the scheduler down. It's MIT-licensed and free, but it's a beta project with a single maintainer and no adoption yet — so we adopt it deliberately, keep our event-listener integration thin, and treat forking as a realistic contingency.
For engineering leads: This is a thin bundle over Symfony's Scheduler component that persists schedules as Doctrine entities and exposes EasyAdmin CRUD. The integration surface is small and mostly declarative: register the bundle, map its entities to an entity manager (careful — disable auto_mapping), run the configuration command, and schedule a messenger:consume scheduler_scheduler worker under Supervisor. The 2.1+ reliability work is the selling point: class-level validation catches the classic "cron expression in the interval field" mistake at form-submit time, SchedulerEntryFaultedEvent plus fault isolation means one bad entry is skipped and logged rather than crashing the worker, and bytespin:scheduler:lint exits non-zero so we can gate deploys. Missed runs default to at-most-one catch-up per task — sensible, and configurable if we disagree. Our real work is the event listeners (before/success/failure/faulted) to route into our existing alerting, and a policy for schema updates on version bumps.
For the product team: This converts "ask an engineer to add a cron job" into a form. It's scoped to internal operations — the value is engineer-hours saved and fewer 2 a.m. pages, not new customer features. Success looks like: reduced scheduling-related incidents, most recurring tasks self-served by ops, and zero scheduler-wide outages traced to a single misconfigured entry.
Risks to state plainly: beta status; no maintainer bench; manual schema updates on upgrade; EasyAdmin coupling; and zero ecosystem validation (0 stars/dependents), which means no safety net of other users finding bugs first. Mitigation: pin the version, wrap our listeners in our own interfaces, and reserve a spike to fork if the project stalls.
How can I help you explore Laravel packages today?