php-http/laravel-httplug
Laravel integration for HTTPlug that wires PSR-7/PSR-18 HTTP clients into the service container, provides package configuration and convenient Laravel access, and lets apps use interchangeable HTTPlug adapters for outbound HTTP requests.
Architecture fit. php-http/laravel-httplug is a thin Laravel service provider wrapping HTTPlug — the PHP-HTTP abstraction layer that predates PSR-18. Its entire value proposition is container registration: it binds Http\Client\HttpClient, Http\Client\HttpAsyncClient, the message/URI/stream factories, and an optionally-configured PluginClient so that application code can type-hint an interface rather than instantiate Guzzle directly. That is a legitimate architectural pattern (dependency inversion on the HTTP boundary), but it is a small amount of glue, and it is glue that Laravel has since absorbed natively via the Illuminate\Support\Facades\Http client and that the wider ecosystem has standardized on via psr/http-client + php-http/discovery. For any greenfield or actively-upgraded codebase, this package is an abstraction over a deprecated abstraction.
Integration feasibility. Low. The last release is 2016-08-03, which places it in the Laravel 5.1–5.4 era: it predates package auto-discovery (Laravel 5.5, Nov 2017), so it requires manual providers/aliases registration, and its illuminate/support constraints and PHP floor will conflict with Laravel 9+ / Symfony 6+ dependency graphs. Expect Composer to resolve-fail rather than merely warn. The underlying php-http/httplug package is flagged abandoned upstream and points at psr/http-client, which means the transitive dependency carries the same risk as the wrapper.
Technical risk. High and asymmetric — the upside is a convenience binding, the downside is an unpatched code path in your outbound network layer.
discovery semantics is fragile if the container is not fully booted.Key questions to answer before any decision.
php-http/* or HTTPlug plugin types (Http\Client\Common\Plugin) anywhere, or would this be a net-new introduction?Http facade removes the entire need.)Assessment: do not adopt. Treat this as a migration-out candidate, not an integration candidate.
Stack fit. Genuine fit exists only for a Laravel 5.1–5.4 application that is already built around HTTPlug clients and plugins. Everything newer — Laravel 7+ with the Http facade, Laravel 9/10/11, PHP 8.1+ — should be considered out of scope by construction.
Migration path (the recommended action for existing adopters). Move the boundary, not the call sites:
App\Http\ClientContract) with the 2–4 methods your domain actually uses. This is the real deliverable; the vendor package was only ever a container binding.psr/http-client with a maintained adapter, or Symfony's Psr18Client, or Laravel's Http facade under a thin adapter.Plugin usage with Guzzle middleware or Laravel's Http::withMiddleware. Note there is no drop-in Plugin↔PSR-18 equivalent; retry/logging/circuit-breaker behavior must be re-implemented and re-tested, which is the single largest unit of work in this migration.php-http/* requires; confirm the abandoned flag disappears from composer why.Compatibility gates. Manual provider registration (auto-discovery does not apply); Illuminate\Contracts\Foundation\Application binding signatures; config publishing semantics; and — critically — exception mapping, since HTTPlug throws Http\Client\Exception where PSR-18 throws Psr\Http\Client\ClientExceptionInterface. Any catch block on the HTTPlug type is a silent behavioral regression waiting to happen.
Sequencing. Dependency inventory and call-site census first (estimate S–M for a small app, M–L if plugin chains exist) → freeze the version and pin it → land the internal interface → swap implementations behind the interface → delete the package. Do this as a background workstream; it does not warrant a dedicated epic unless the HTTP plugin chain is load-bearing.
Maintenance. Effectively zero upstream maintenance. You inherit the codebase. Expect composer audit/SCA tooling to surface the abandoned flag, and expect to justify it in any security review — or vendor a fork, which converts a dependency into owned code with no community to lean on.
Support. No viable support channel. Twelve stars implies effectively no install base, so Stack Overflow and issue-tracker archaeology will not help your engineers; every incident becomes first-principles debugging of a decade-old integration.
Scaling. The package itself is not a throughput bottleneck — the underlying client (Guzzle et al.) handles connection pooling and TLS. The one genuine capability worth preserving is HTTPlug's async/promise client, which is useful for high-fan-out aggregation. If you rely on that, migrate it deliberately to Guzzle promises or a concurrent-request pool rather than losing it in the swap.
Failure modes to monitor during transition.
Ramp-up. Non-trivial relative to the payoff. HTTPlug asks engineers to learn a three-part mental model (client / message factory / promise) that Laravel developers no longer encounter, and the package publishes no documentation of its own. Budget onboarding time for anyone touching the HTTP layer, and treat the internal-interface refactor as the actual knowledge-transfer artifact — it is what makes the team portable off this dependency later.
Bottom line for the portfolio: 1.47/5 with a 1.14 opportunity score is the correct read. The capability is real but commoditized; the package is a 2016 shim for a deprecated spec with no maintenance path. Recommend no new adoption, and a scoped, low-priority migration for any existing usage.
How can I help you explore Laravel packages today?