Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Symfony Schedule Bundle Laravel Package

m-adamski/symfony-schedule-bundle

A Symfony bundle for scheduling recurring tasks and console commands. Define schedules in configuration, run jobs on cron-like intervals, and integrate cleanly with Symfony's console and dependency injection.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Scope. m-adamski/symfony-schedule-bundle is a third-party Symfony bundle that adds cron-style scheduling of console commands, distributed as a Composer package wired into the Symfony DI/HttpKernel pipeline. We are evaluating it from a Laravel/PHP platform position.

Release delta — 4.0.0 (Symfony 7.x). The only published change is a compatibility target: Symfony 7.x. Reading it as a TPM:

  • It is a major version bump, which by semver convention means the Symfony 6.x support floor is dropped (or at minimum the supported matrix narrowed). Consumers on Symfony 6.x must stay on 3.x, splitting the — already nonexistent — user base across two lines.
  • It is a maintenance signal, not a capability signal. No new features, no deprecations called out, no security fix, no test-coverage or locking/DST behavior change. The functional surface is identical to what we evaluated.
  • It partially retires one risk item (Symfony 7.x readiness previously "unknown") but leaves the adjacent ones open: PHP 8.4 support, Symfony 8 readiness, and the fact that symfony/scheduler (6.3+, canonical in 7.x) is now the first-party answer on the exact version this release targets.
  • Net effect on the decision: none. A framework-mismatch finding is not moved by a framework-version bump. The release confirms the package is alive enough to track upstream; it does not make it installable or useful in Laravel.

Architecture fit — the headline is a framework mismatch.

  • A Symfony bundle's unit of reuse is the kernel/DI compile pipeline: Bundle::build(), Extension::load(), tagged services, compiler passes, cache warmup. Laravel has no Bundle concept; its container is Illuminate\Container with service providers (deferred and eager). The package cannot be installed into a Laravel app and be functional.
  • Laravel already ships a more mature equivalent: Illuminate\Console\Scheduling\Schedule populated in App\Console\Kernel::schedule(), with ->cron(), ->withoutOverlapping(), ->onOneServer(), ->runInBackground(), task hooks, and schedule:list / schedule:test / schedule:work, driven by a single schedule:run cron entry. That covers ~95% of real scheduling needs.
  • Upstream absorption risk is now sharper, not softer: 4.0.0 targets Symfony 7.x, the same major where symfony/scheduler (#[AsSchedule] / ScheduleProviderInterface / RecurringMessage) is the canonical answer. The release moves the package into the version range where the first-party component is strongest.
  • Net: zero fit as a runtime dependency in a Laravel codebase; unchanged moderate fit as a design reference.

Integration feasibility.

  • Direct integration: not viable for Laravel. Feasible only in a coexisting Symfony 7.x service inside a polyglot monorepo, where it would need its own kernel context and its own cron entry — and there the first-party component is the better default.
  • Porting the concept is cheap because the concept is small: cron-expression registry + runner + a lock. On top of Laravel's Schedule, an attribute-based declaration layer (#[Scheduled('0 * * * *')] on job classes, consumed by the kernel's schedule() method) is roughly 3–5 dev-days including tests; a 1–2 day spike is enough to confirm the gap is real.

Technical risk.

  • Abandonment (downgraded slightly, not cleared): 13 stars, 0 dependents, single author. The 4.0.0 release shows the maintainer is still responsive to upstream majors, which is the first positive signal on this axis — but 0 dependents still means 0 battle-testing and no de facto compatibility signal. Low score (0.125) and low opportunity remain consistent with "interesting pattern, poor dependency."
  • Bus factor 1, no foundation backing, no published security policy. MIT licensing makes it forkable — a mitigation, not an elimination of the risk.
  • Version drift (partially addressed): Symfony 7.x confirmed as of 4.0.0. PHP 8.4 and Symfony 8 readiness still unknown. Note the new coupling: because 4.0.0 drops the older line, a future Symfony 8 bump will likely force another major and another split. It still relies on upstream internals (compiler passes, schedule building) that break on minor bumps.
  • Semantic risk (unchanged by this release): timezone/DST handling, overlap prevention, and missed-window catch-up are exactly where homegrown schedulers fail silently — and there is still no test corpus to trust. A compat-only major does not de-risk this.
  • Composer friction: in a Laravel app it would pull/pin symfony/console and symfony/dependency-injection, which Laravel also pins transitively — resolution conflicts for no functional gain. 4.0.0 raising the Symfony floor makes that pin tighter against Laravel's own constraints.

Key questions to resolve before any commitment.

  1. Do we operate any Symfony runtime at all, or is this purely a Laravel/PHP shop? (If Laravel-only, this is a read, not a dependency.)
  2. Which specific capability do we lack — colocated attribute-based declaration, declarative config-as-code schedules, or byte-identical schedule definitions across frameworks?
  3. Who owns the fork if we need patches, and what is the SLA?
  4. What are our current multi-node and timezone guarantees?
  5. Is there a compliance/audit requirement forcing schedules out of Kernel::schedule() and into declarative config?
  6. (New) If we do run Symfony, are we on 7.x — and if so, why would we take a 13-star bundle over symfony/scheduler?

Integration Approach

Stack fit.

  • Laravel 10/11 (PHP 8.1–8.3): no direct fit; do not add to composer.json. 4.0.0 does not change this.
  • Symfony 7.x service, if one exists: technically viable on 4.0.0, but prefer first-party symfony/scheduler. On Symfony 6.x we would be pinned to 3.x — a second reason not to build a dependency on this.
  • Mixed/polyglot repo: keep the Symfony bundle isolated to the Symfony service, behind a dedicated cron entry per environment.

Migration path (recommended — unchanged by 4.0.0).

  1. Treat the repository as a specification: read the Bundle class, DI extension, schedule provider/registry, runner command, and lock strategy. Produce a one-page ADR mapping each concept to Laravel equivalents and listing gaps only.
  2. Compare against Illuminate\Console\Scheduling\Schedule and symfony/scheduler; most "gaps" disappear.
  3. If one gap survives (most likely: colocated, attribute-based schedule declaration on job/command classes), build a thin layer over Laravel's Schedule — Laravel stays the executor and source of truth. Do not introduce a second scheduler.
  4. Consolidate any raw crontab entries into the single schedule:run tick.

Compatibility checks (in order, cheapest first).

  • PHP floor/ceiling and Symfony component version ranges vs. our matrix — with 4.0.0 this check now has a clear answer for Symfony 7.x and no answer for PHP 8.4 / Symfony 8. This check alone still usually terminates the evaluation.
  • Locking mechanism: does it require a shared store (Redis/DB) or assume single-node?
  • Where schedules live (attributes vs. YAML vs. DB) — determines config-as-code and PR-review workflow fit.

Sequencing (~1 engineer, low priority, 2 sprints).

  • Sprint 0 (2 days): spike + ADR + go/no-go, with effort estimate for the gap layer. Fold the 4.0.0 review into this — it is a 30-minute check, not a work item.
  • Sprint 1 (1 week): if approved, build the attribute layer + tests + schedule:list integration.
  • Sprint 2: observability (started/finished/failed events → logs and metrics), then decommission legacy crontabs.

Recommendation: do not take a runtime dependency. 4.0.0 is a compatibility catch-up, not a capability gain, and it does not touch the framework mismatch. Leverage as reference material and, at most, reimplement the single pattern that adds value on top of Laravel's scheduler.

Operational Impact

Maintenance.

  • If adopted: we inherit a single-maintainer project with no downstream users. Budget ~1–2 days/quarter for triage and compat patches, plus a standing risk of an emergency fork. The 4.0.0 release shows the maintainer tracks upstream majors, so expect one forced major per Symfony cycle (~yearly) — that is now a predictable line item rather than a hypothetical.
  • If reimplemented: ~150 lines plus tests on top of Laravel's Schedule; maintenance approaches zero because we ride Laravel's release train, which we already track.
  • SBOM/security review: every abandoned transitive package is a finding. Fewer dependencies is a positive, measurable outcome.

Support.

  • Community support is effectively absent (13 stars, 0 dependents, no issue-velocity signal). The 4.0.0 release is a data point on liveness, not on support capacity — there is still no one to escalate to but the author. Internal ownership and a documented fork procedure remain prerequisites for any adoption.
  • Onboarding: little to no documentation, so ramp-up is source-reading — ~1–2 days for a mid-level PHP dev to explain the mechanism, ~half a day to use the resulting internal layer, since it looks like the scheduler they already know. 4.0.0 ships no docs work, so this estimate is unchanged.

Scaling.

  • Scale by convention: one cron entry + onOneServer() (atomic cache lock) + withoutOverlapping(). Confirm the cache store supports atomic locks — Redis or database, not file/array.
  • Push long-running work to the queue (->runInBackground() or dispatch a job) so a slow task can't block the tick.
  • Fix one timezone policy (UTC schedule expressions + explicit app timezone) and enforce it in review; this is the most common silent-failure class.

Failure modes and detection.

Failure Symptom Mitigation
Missed run (cron absent, container restart) Nothing happens, no error Heartbeat/"ran in last N windows" alert
Overlap / duplicate on multi-node deploy Duplicate side effects onOneServer() + idempotent handlers
Swallowed task failure Non-zero exit ignored ->onFailure() hooks, per-task metric
Stuck mutex Task stops forever Lock TTL + schedule:clear-cache runbook
DST/timezone drift Double or skipped run UTC-only expressions, tested transitions
Bundle upgrade breaks DI compile Boot failure, not task failure Pin versions; only relevant if adopted directly. 4.0.0 is a live example — an unplanned major on the Symfony line can block a framework upgrade

Runbook requirements: schedule:list output in the deploy checklist, per-task success/failure dashboards, and a documented "scheduler is down" escalation path.

Ramp-up.

  • Conceptually low — anyone who has used cron or Laravel's scheduler is productive in days. The expensive part is governance: naming, ownership, alerting, and preventing a second parallel scheduling mechanism from sprouting.
  • Adopt an internal standard: every recurring task declared in one place, with an owner and an alert; no raw crontab entries outside platform-owned infrastructure.

Bottom line for the portfolio: high interest as a pattern, low value as a dependency. 4.0.0 (Symfony 7.x) confirms the package is maintained but changes nothing about fit — it is a compat bump that lands the package squarely in the version range where Symfony's own scheduler supersedes it. The deliverable remains a decision record plus (optionally) a small internal abstraction on Laravel's scheduler — not a new vendor.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
mehedimi/laravel-amp-mail
happones/laravel-vue-i18n-generator
jwerd/inertia-table
siberfx/flysystem-wasabi
hollyit/token-replace
ippanelcom/laravel-sdk
adachsoft/changelog-linter
adachsoft/collection
payerurl/telegrambot-crypto-payment-instant-payout
dskripchenko/laravel-hybrid-search
riorizkyrainey/lara-ced
mehedimi/static-vel
zharp/zharp
nonsapiens/bigquery-model-sync
lgu-bayambang-ict-office/lgu-laravel-development-standards
andydefer/laravel-support
se7enxweb/flysystem
lampwick/laravel
jeslage/statamic-emojis
micahdshackelford/rmap-laravel