smartassert/health-check-bundle
Symfony bundle that adds a configurable health-check endpoint to your app. Define checks for databases, cache, and custom services, then expose a JSON status report for load balancers and monitoring systems.
Architecture fit. This is a Symfony bundle, not a Laravel package, and that distinction still drives the entire assessment. It integrates through Symfony's Kernel, bundles.php registration, a DI extension/compiler pass, tagged health_check services, and a routing loader. Laravel has no bundle concept, no Kernel::registerBundles(), and no equivalent routing/config loaders — a Laravel application cannot install and boot this package as designed. What is portable is the core domain model: a health-check interface, a collection/aggregator, and individual checks (database connectivity, Redis, etc.) that return a result object mapped to an HTTP status. That model maps cleanly onto Laravel's container, but only via extraction or a fork, not via composer require. Release 8.2 does not change this. It is a constraint-widening release (symfony ^7 || ^8), not an architectural one; nothing in the integration surface described above moves.
Integration feasibility.
spatie/laravel-health and skip this dependency. Extraction is roughly 1–3 engineer-days including adapters for your own checks and tests, because the reusable code is thin — you are buying a shape, not a system.symfony/framework-bundle, symfony/http-kernel, symfony/routing) will drag a parallel framework stack into a Laravel app if you try to install it directly. Do not.Technical risk.
^7 || ^8, which is forward-looking rather than merely current, and it demonstrates that the maintainer ships compatibility bumps rather than letting the package rot. That is the strongest signal emitted by this repository to date, and it materially de-risks the Symfony host path.^6 || ^7, then 8.2 drops Symfony 6 — a breaking change for anyone on 6, released under a non-major version. We cannot confirm the before/after constraints from the release note alone. This matters operationally: an unpinned caret range in a lockfile-driven upgrade could silently move a Symfony 6 app off support. Treat constraint changes here as potentially breaking until verified.Key questions.
HealthCheckInterface and the result model if we build adapters against them?Stack fit. Treat this as a reference design, not a dependency, if you are on Laravel. The portable pieces — a check interface, an aggregator that short-circuits, a result-to-HTTP mapping, and a routing surface under /health and /health/{check} — are each under a few hundred lines. If you are on Symfony 7 or 8, it fits natively, and 8.2 means it fits your upgrade roadmap too, which is the more useful property.
Migration path. Do not rip out existing probes. Stand up the new endpoint in parallel and shadow it:
Compatibility.
composer.json at both tags, not from the release note.spatie/laravel-health (active, Laravel-native, tagged, scheduling-aware) plus your own custom checks. The MIT license means extraction is legally trivial if you prefer to own it, but ownership has a cost the license does not show. 8.2 does nothing to change the Laravel calculus.Sequencing.
composer.json at 8.1 and 8.2, diff the Symfony and PHP ranges, check CI matrix. This is now the cheapest and highest-value step.queue:monitor, critical third-party API. Keep the list to what genuinely predicts user impact; a health check that fails for a non-critical dependency trains people to ignore it.Maintenance. Low code volume and — as of 8.2 — demonstrated willingness to track framework majors, which is the maintenance signal that actually matters for a small package. That said, the burden you carry is still ownership: with zero dependents and one maintainer, the release cadence is one person's calendar. Budget for becoming the maintainer, formally or de facto, if this becomes load-bearing. The countervailing new risk is that constraint changes arrive as patch releases, so your upgrade hygiene must be stricter than the version numbers imply: pin explicitly, read composer.json diffs on every bump, and treat Symfony/PHP range changes as breaking until proven otherwise.
Support. GitHub issues with no SLA, no commercial backing, no published deprecation policy. Release velocity is now a genuine positive data point rather than a single encouraging sample, and Symfony 8 support specifically signals the maintainer is working ahead of the ecosystem rather than behind it — but this is one contributor responding to one framework release, and it is still an organization whose primary customer is itself.
Scaling. Health checks are cheap individually and expensive in aggregate because they are polled constantly and often redundantly: Kubernetes liveness × replicas × 10s intervals, plus a load balancer, plus an uptime monitor, plus a dashboard. Every poll that reaches a database or Redis is real load, and it arrives exactly when the dependency is already struggling. Mitigations: cache readiness results for a short TTL, cap per-check timeouts well below the probe timeout, keep dependency-aware checks out of liveness entirely, and prefer a shallow liveness probe that touches nothing.
Failure modes.
composer update can move you across a support boundary with no major-version signal. Lockfile review is the control.Ramp-up. An engineer familiar with Symfony reads this in well under an hour and can extend it the same day. A Laravel-only team pays an extra half-day of context switching to reason about bundles and compiler passes — which is itself an argument that the extraction path costs less than it appears, since you would rewrite the wiring anyway.
Recommendation. Conditional adoption, with the Symfony path upgraded from "verify first" to "adopt if constraints match." Release 8.2 resolves the sharpest unknown in the prior assessment and demonstrates forward compatibility with Symfony 7 and 8; for a Symfony 7/8 host, that is sufficient to proceed, subject to confirming the exact range and CI matrix. For a Symfony 6 host, confirm whether 8.2 dropped support before planning an upgrade — this is the one way this release can hurt you. For a Laravel host, nothing has changed: do not install this package; treat it as a design reference and either extract the ~300 lines you need under a service provider or use a maintained Laravel-native health package. In every case the integration effort is dominated by operational hardening — liveness/readiness split, timeouts, access control, payload sanitization — not by the library choice, and that work is identical whichever path you take.
How can I help you explore Laravel packages today?