php-http/httplug-pack
Convenience Composer metapackage for HTTPlug that installs the HTTP client abstraction with a PSR-7 implementation and message factories, giving PHP apps a quick, interoperable setup for sending HTTP requests.
What this actually is. php-http/httplug-pack is not a library — it is a Symfony Flex "pack": a metapackage whose only job is to expand into a curated set of php-http/* requirements at composer require time. There is no runtime code, no service, no API surface, and no artifact shipped to production. This is the single most important fact for scoping: the package itself carries near-zero technical risk and near-total strategic risk.
Architecture fit. It only has meaning inside a Symfony application with symfony/flex installed and enabled as a Composer plugin. Outside Flex it is inert — Composer will install an empty metapackage and the developer gets nothing. For a non-Symfony or non-Flex codebase, or for a Laravel codebase (where this package's naming and the -pack convention do not apply), the fit is poor to nonexistent; the equivalent value is a one-line composer require of the actual components. Even within Symfony, the value is a one-time scaffolding convenience, not an architectural decision.
Maturity signals are uniformly negative. 38 stars, 0 tracked dependents, a last release of 2019-04-08 (pre-dating PHP 8, Composer 2.2's plugin allowlist, and PSR-18's consolidation of the HTTP client abstraction), and a composite score of 0.38. The opportunity signal (21.92) points the same direction. Zero dependents is the load-bearing number: no downstream consumers means no community validation, no incidental bug reports, no one triaging CVEs against this constraint set.
Technical risk. Three distinct exposures:
psr/http-client) and PSR-17 (psr/http-factory) superseded it. A 2019 pack will resolve to HTTPlug-era constraints and may pin php-http/httplug v1 or pull packages such as php-http/message-factory that were abandoned in favour of PSR-17. Anyone adopting this is adopting the older abstraction layer by accident.allow-plugins configuration, the pack resolves to nothing and the developer believes an HTTP client was wired up. This produces a failure at first request, not at install time.Key questions for the team. Does any service actually depend on HTTPlug-typed interfaces (Http\Client\HttpClient), or is PSR-18 acceptable everywhere? Which concrete packages and versions does the pack expand to today, and are any of them flagged abandoned or carrying advisories? Who owns the dependency, and is there a documented removal path? Does our Composer policy allow the symfony/flex plugin at all? And, bluntly: if the pack were deleted from Packagist tomorrow, would anything we run break?
Verdict. Treat as legacy debt with a shelf life, not a component to adopt. It is safe to leave in place where already installed (it costs nothing at runtime) and should be actively avoided for new work.
Stack fit. The realistic footprint is Symfony 4.x/5.x applications that installed it between 2018 and 2020. In a modern stack (Symfony 6/7, PHP 8.2+, PSR-18-first), the pack is redundant: the correct recipe is a PSR-18 client plus a PSR-17 factory implementation, and Flex's own recipes handle the wiring for the concrete choice (symfony/http-client, nyholm/psr7, etc.). For a Laravel codebase, skip it entirely — Laravel's HTTP client and Guzzle already cover this ground, and the Flex pack mechanism has no analogue.
Migration path. This is a substitution, not a rewrite:
php-http/* packages the pack actually contributed — composer show --tree or composer why against the pack, plus a diff of composer.json history around the install commit.symfony/http-client is the low-friction choice in Symfony; guzzlehttp/guzzle 7.x is the option if Guzzle is already present. Pair with nyholm/psr7 for PSR-17.Psr\Http\Client\ClientInterface / Psr\Http\Message\RequestFactoryInterface. Most call sites are a one-line type swap; php-http/discovery users need to move to explicit wiring or Symfony's autowiring.composer remove php-http/httplug-pack and any orphaned php-http/* packages that are no longer referenced.Compatibility. Two gate checks before anything else: Composer 2.2+ requires explicit allow-plugins for symfony/flex (or the pack is a no-op), and the pack's own PHP constraint may be capped below your runtime. Because it is a metapackage, the pack's own constraint is cheap to work around — but the constraints of what it pulls in are not, and those are the real compatibility ceiling. Expect friction on PHP 8 if the resolved HTTPlug generation is v1.
Sequencing. Do not make this a project. Slot it as a low-priority cleanup item inside the next framework-upgrade or dependency-hygiene sprint, batched with the PSR-18 migration that is likely needed anyway. Explicitly block new services from adding it and add a CI or review check for -pack requirements of this vintage. If you have many Symfony services, migrate the one with the most active development first to establish the pattern, then sweep the rest opportunistically — there is no deadline pressure because the package is not shipping code.
Maintenance. The pack itself has no maintenance burden — there is nothing to patch. The burden sits in the transitive set, which nobody in the php-http ecosystem is actively shepherding at the -pack layer. The realistic maintenance cost is archaeology: six to eighteen months from now, an engineer hitting a resolution conflict will spend hours discovering that a 2019 metapackage is the root cause. Budget for a one-time inventory line ("we know where these are") rather than an ongoing one.
Support. No vendor, no SLA, no maintainer commitment, MIT-licensed and effectively unowned. The support model is "whoever wrote the original commit and is still here." Contrast with the components it installs, which have at least a community and, in the PSR-18 case, a formal specification behind them. This asymmetry is the practical argument for removing the pack while keeping the functionality: you retain the supportable parts and drop the unsupportable wrapper.
Scaling. Negligible in both directions. Install-time cost is one extra Composer resolution; runtime cost is zero by construction. It does not affect request throughput, container size, or boot time. The only thing that scales badly is the count of services carrying it, because each is an independent future blocker during a PHP or framework uplift — an N-service upgrade becomes N investigations instead of one.
Failure modes to plan for.
php-http/message-factory being formally flagged abandoned and generating Composer warnings or audit noise the team then has to triage and justify.allow-plugins defaults tighten further and Flex stops running non-interactively in CI.Ramp-up. Near-zero to learn the package, non-trivial to learn what it replaced. No engineer needs training on httplug-pack; they need the PSR-18/PSR-17 mental model — client vs. request factory vs. stream factory, and why discovery-by-convention was replaced by explicit wiring. That is a half-day of orientation for a mid-level engineer and pays back on every future HTTP integration. Frame the work as "modernise the HTTP client layer," not "remove a package"; the former is a genuine capability uplift and the latter reads as janitorial work that will not get prioritised.
How can I help you explore Laravel packages today?