levuro/job-queue-bundle
levuro/job-queue-bundle provides a lightweight, database-backed job queue for Symfony apps. Dispatch background jobs, process them with worker commands, and manage retries, failures, and delayed execution without adding external queue infrastructure.
This is not a Laravel package — that is the first thing to settle. Despite living on Packagist and being installable via Composer, levuro/job-queue-bundle is a Symfony bundle (JMSJobQueueBundle) built on Doctrine ORM, FrameworkBundle, and the Symfony console. It ships no Laravel service provider, no facade, no publishable config/jms_job_queue.php, and no integration with Laravel's queue contract, Illuminate\Bus abstractions, or Eloquent. "Laravel/PHP package" in the metadata is a category label, not an integration claim. As TPM, treat any roadmap line item that assumes drop-in Laravel usage as mis-scoped and correct it before a single sprint is spent.
Architecture fit — where the product value actually is. The bundle's real offering is a persistent, inspectable job queue: each job is a database record (with Job/RelatedJob entities), processed by a jms-job-queue:run worker, with recurring/cron scheduling, retry and failure states, and an admin web UI. Two properties matter for product decisions:
Horizon path requires more care to replicate (though afterCommit / the database driver narrows the gap).Both are achievable in Laravel with the built-in database queue driver plus a thin job_audit table, or with Horizon's metrics/failed-job store. So the capability is worth having; this package is not the cheapest way to get it in a Laravel estate.
Technical risk.
symfony/debug dropped, symfony/error-handler required (PR #20). No features, no deprecations, no API changes. That is fine for stability, but it confirms the project is in keep-the-lights-on mode and should not anchor a multi-year roadmap.composer update. Low blast radius here, but it signals the maintainer's release discipline.symfony/error-handler exists only from Symfony 4.4+. If the bundle's framework-bundle/console constraints still permit 3.4 or 4.0–4.3, the requirement set becomes unsatisfiable on that floor — a loud CI failure, but a failure.symfony/debug arriving transitively (custom worker error handling, public/index.php bootstrap, bin/console) fails at runtime, not install time. That is the one genuinely sneaky failure mode in this release.Key questions.
Stack fit — decision rule. Adopt only when: the runtime is Symfony 4.4+ (ideally 5.4/6.x), Doctrine ORM is already in the tree, expected volume is low thousands of jobs/hour or less, and durable job records / operator visibility are product requirements rather than nice-to-haves. Do not adopt when: the application is Laravel-first, persistence is Eloquent/MongoDB, volume is broker-scale, or the team needs an actively evolving feature roadmap.
For a Laravel codebase specifically, the integration is not "install and configure" — it is a bespoke bridging project: pull in laravel-doctrine/orm for entity mapping, hand-wire the bundle's services into Laravel's container, run a second console entry point, and maintain that glue forever. That is engineering spend to acquire a queue we already have. The only defensible trigger is coexistence: we already run a Symfony service (legacy batch/reporting/integration-sync system) whose job history we need in one place, and we are strangling it toward Laravel over time.
Migration path for 1.10.9 (fold into a routine dependency-refresh cycle; do not run as a standalone release event):
composer why symfony/debug and composer why-not symfony/error-handler across every service that depends on the bundle.Symfony\Component\Debug across application code, custom worker wrappers, and error-handling bootstraps — this is the only place the patch can bite silently.1.10.9 explicitly rather than floating; run the suite against the lowest supported Symfony version, then promote.symfony/error-handler resolves alongside the pinned framework-bundle — usually a lockfile no-op on modern Symfony.1.10.8 and gets a separately scheduled platform upgrade. Do not let a patch bump force an emergency framework upgrade.Compatibility posture. Verify the declared constraints rather than assuming 4.4–6.x support. Record the supported-platform matrix (Symfony floor, PHP floor) as an owned artifact; unsupported combinations should fail in CI, not in production.
Sequencing. Two gates, in order: (a) Does a Symfony runtime exist in our estate? If no, stop — the answer is Laravel's queue. (b) If yes, is the Laravel-side queue abstraction spike scheduled before we invest further here? That spike could moot this work entirely. Run it first.
Maintenance. Positive for this release — removing an abandoned, EOL-coupled package reduces audit/CVE noise and aligns with the component Symfony itself replaced it with. The ongoing concern is the pattern, not the patch: dependency-only releases mean on-call must keep CI pinned to a Symfony floor or risk silent breakage on composer update. Plan for this repository to require occasional fork-and-patch if the maintainer goes quiet.
Support. No user-facing behavior change, so no runbook or documentation updates are required. Two caveats: (1) if the Symfony floor is effectively raised, update the internal supported-platforms note so an install failure isn't debugged as a queue bug; (2) in a Laravel estate the operational knowledge for this bundle exists in exactly one or two people — capture a written runbook before it becomes tribal.
Scaling. Unchanged by this release but worth restating for the roadmap: this queue scales with the database, not independently. Watch job-table growth and index health, worker concurrency versus DB connection-pool limits, and lock contention between in-transaction enqueues and the polling worker. Recurring/cron job rows accumulate and need the bundle's cleanup command scheduled. Sustained churn beyond roughly a few hundred jobs/second is the point where a broker-backed queue is the better answer.
Failure modes.
class not found from a lingering symfony/debug reference (silent until the error path is hit — the one to guard against). Mitigation: a smoke test that deliberately throws inside a job, not just a green composer install.Ramp-up. Low for a Symfony/Doctrine team: roughly a day to run the worker, read the admin UI, and understand scheduling. The learning cost sits in operating a DB-backed queue (transaction boundaries, worker supervision, cleanup), not in the package API. For a Laravel-only team the ramp-up is a framework migration plus permanent glue — reflect that in any estimate that assumed a drop-in component, and prefer the Horizon-or-database-driver path with a lightweight job-audit table unless a Symfony service already makes coexistence unavoidable.
How can I help you explore Laravel packages today?