setono/job-status-bundle
A Symfony bundle for tracking the status of asynchronous jobs and background tasks. Mark jobs as pending, running, completed, or failed, then query progress and results from anywhere in your app.
Architecture fit. The package is a Symfony bundle, not a Laravel package. It depends on Symfony's bundle/DI extension model (Bundle class, Extension, service definitions, likely autoconfiguration via compiler passes) and — based on the description and typical Setono patterns — on Doctrine ORM for persisting job status records. Laravel's service container, provider model, and Eloquent ORM are architecturally distinct; there is no service provider, no config bridge, and no facade. It cannot be composer required into a Laravel app and used as-is. The concept it abstracts — a durable record of an async job's lifecycle (queued → running → progress → complete/failed, with timestamps and error context) — is framework-agnostic and genuinely useful. The value here is the domain model and the design pattern, not the shipped code.
Integration feasibility. Two distinct paths:
JobProcessing / JobProcessed / JobFailed / JobExceptionOccurred), a progress-reporting contract jobs opt into, and a read endpoint for the UI. Realistic estimate for a focused engineer: 3–10 days for a production-quality minimal version, excluding UI. That is likely less total effort than writing and validating an interop shim around a Symfony bundle inside Laravel.Technical risk. Material, and concentrated in provenance rather than code quality:
Key questions for the maintainer/spike:
Stack fit. Assuming a Laravel + PHP 8.x stack with Redis/SQS queues and Horizon, the overlap question comes first: Horizon already exposes queue-level health, recent-job inspection, tags, and wait/runtime metrics. This package addresses a different concern — business-process progress for a single long-running job that a user is waiting on. Confirm the team isn't solving a problem Horizon already covers before investing.
Migration path. Treat the repository as a reference design, not a dependency. Vendor or fork it only if the team wants the exact API; otherwise reimplement:
job_statuses table: UUID, job type/class, status enum, progress (0–100 or step counter), message, serialized context, started_at, finished_at, heartbeat_at, attempt.JobStatus Eloquent model plus a small JobStatusRepository.TracksProgress job middleware that creates the record on dispatch, marks running on JobProcessing, and terminal-states on JobProcessed / JobFailed / JobExceptionOccurred.ProgressReporter contract injected into jobs for mid-flight updates (throttled).Compatibility. Verify Composer constraints against the app's Laravel and PHP versions before any spike. If adopting the bundle anywhere, pin the commit and audit transitive Doctrine/Symfony ranges for conflicts against doctrine/dbal already in the lockfile. For a Laravel-native port, the only hard requirements are the framework's queue events and a storage driver — no external constraint risk.
Sequencing.
Maintenance. Effectively unmaintained. Any adoption is a fork-and-own commitment: the team inherits bug fixes, framework-version compatibility work, and security patching for a bundle running on a framework that may not even be the primary stack. A Laravel-native reimplementation of ~300–500 lines is cheaper to own than a foreign-framework fork, and this should be the default recommendation.
Support. No vendor, no SLA, no issue history to search, and 0 dependents means no community troubleshooting trail. Internal escalation is the only path — budget for that in the owning team's capacity, not in a "dependency" line item.
Scaling. The status table becomes a write-hot table proportional to job throughput and progress granularity. At high volume this needs: throttled progress writes (e.g., only on ≥5% delta or ≥2s interval), an index on (status, created_at) for dashboards, and a scheduled prune of terminal records. The read path is the other scaling risk — naive per-client polling of a progress endpoint at 1s intervals multiplies load; prefer SSE/broadcast or adaptive backoff.
Failure modes to design against explicitly:
running forever. Requires a heartbeat_at column and a stale-job reaper.Ramp-up. Low technical ramp for a Laravel-native port — the API surface is a handful of states and one contract, learnable in under a day. Ramp-up for adopting the bundle itself is higher than it looks: engineers must read Symfony bundle conventions, DI wiring, and Doctrine mapping to debug something they cannot get upstream fixes for, in a stack they don't otherwise operate.
Bottom line for the decision record: the abstraction is worth adopting; the artifact is not. Score of ~0.50 with zero dependents and a 2022 release reflects a dormant, unvalidated package whose only durable value is as a design reference for an in-house job-progress model.
How can I help you explore Laravel packages today?