overtrue/http
overtrue/http provides a simple, expressive HTTP client for PHP, making GET/POST requests, JSON handling, headers, and response parsing easy. It works in standalone PHP and Laravel projects, offering a lightweight alternative to heavier HTTP clients.
Architecture fit. overtrue/http is a thin convenience wrapper around a PSR-7/PSR-18 HTTP client (Guzzle under the hood). It is framework-agnostic — no Laravel service provider, no facade, no config publishing — so it does not "fit" Laravel's architecture so much as sit beside it. In a Laravel codebase it competes directly with the first-party Illuminate\Support\Facades\Http client, which already wraps Guzzle and adds testing fakes, retries, and container integration. From a portfolio perspective this package only earns a place if it is pulled in transitively (most commonly by the EasyWeChat family) rather than chosen deliberately.
Integration feasibility. Composer-installable, small surface area (GET/POST/PUT/DELETE plus options like timeout, headers, and query params). The API is easy to learn and easy to wrap behind an internal interface. The practical constraint is dependency alignment: it pins a Guzzle major version and a PHP floor from the 2022 era, so installation is feasible but you will be resolving constraints against a modern Laravel skeleton rather than adding cleanly to it.
Technical risk. Elevated for four reasons: (1) the last release is March 2022, so there is no evidence of maintenance through PHP 8.2/8.3 and Guzzle 7.x security advisories; (2) the repository is listed as unknown, which blocks due diligence on commit history, issue triage, and licence; (3) 125 stars and a 1.335 score indicate a single-maintainer, low-adoption package — the classic bus-factor-1 profile; (4) it handles outbound credentials and TLS, which is exactly the surface where an unpatched wrapper is most expensive. The compensating factor is that the code is trivially replaceable: it is a wrapper, not an engine.
Key questions. What does this wrapper give us that Guzzle or Laravel's HTTP client does not? Is it a direct dependency or only transitively required by another package we actually want? Who maintains it, under what licence, and can we reach them? Which Guzzle and PHP versions does the current constraint allow, and is there a supported upgrade path?
Stack fit. Poor as a first-class choice, acceptable as a transitive one. Laravel's HTTP client already provides retries, middleware, fakes for tests, and container-level configuration; adopting a second, unmaintained wrapper creates two idioms for outbound calls in one codebase, which is a review and onboarding cost with no functional payoff.
Migration path. If the package is a direct dependency, the migration is mechanical: replace calls with Http:: in Laravel or a Guzzle client in non-Laravel contexts, and delete the dependency. Because the wrapper exposes a narrow verb-plus-options API, most call sites translate one-to-one. Budget the work as a small refactor plus test updates, not a rearchitecture. If it is transitive via EasyWeChat, do not migrate — pin it, track the parent package's upgrade, and let it disappear on that package's next major.
Compatibility. Expect friction at the edges: a PHP constraint that predates current language versions, a Guzzle pin that may conflict with what Laravel 10/11 ships, and no declared support matrix. Validate with a composer why overtrue/http and a constraint dry-run before committing to any plan; the answer determines whether this is a one-line removal or a dependency-graph negotiation.
Sequencing. First, establish whether the package is direct or transitive — this single fact drives everything else. Second, if direct, inventory call sites and confirm none rely on wrapper-specific behaviour. Third, migrate to the platform client and remove the dependency in the same change. Fourth, if transitive, pin the version explicitly, add it to the dependency-watch list, and set a review trigger tied to the parent package's next release. Do not sequence this ahead of higher-value work; it is hygiene, not a programme.
Maintenance. Effectively unmaintained by current standards: no release in over three years. There is no credible expectation of a patch for a CVE in Guzzle or a break in a new PHP minor. Any maintenance is ours by default, which is a poor trade for a wrapper we could replace with vendor-supported code.
Support. Community-only, single maintainer, no commercial backing, no SLA. The repository being unknown removes even the ability to read issue history when something breaks. Escalation path in an incident is effectively "read the source and fork it."
Scaling. Operationally negligible. Throughput, connection pooling, and concurrency are inherited from Guzzle, so the wrapper imposes no meaningful ceiling and no measurable overhead. The scaling risk is organisational, not technical: the number of services depending on an unpatched client grows silently over time.
Failure modes. Most likely failure is a Composer resolution conflict when another package requires a newer Guzzle — a build-time break that is loud and cheap to fix. More dangerous is the silent failure: a TLS or redirect-handling flaw in an old Guzzle that never gets patched, on a code path handling API credentials. Least likely but worst is maintainer unavailability coinciding with a required fix, forcing an emergency fork.
Ramp-up. Trivial. Any PHP developer understands the API in minutes and the migration target is well documented. The real onboarding cost is the inverse of the usual problem: engineers must be told not to use it, and that convention has to be enforced in review while it remains in the dependency tree.
Recommendation. Treat as technical debt to be retired, not a component to be adopted. If it is transitive, pin and monitor. If it is direct, schedule replacement with Laravel's HTTP client or Guzzle in the next maintenance window, and add a CI check that fails on new direct usages.
How can I help you explore Laravel packages today?