Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Http Transport Laravel Package

innmind/http-transport

Innmind HTTP Transport is a PHP library for sending HTTP requests and handling responses through a clean, framework-agnostic API. Designed for the InnMind ecosystem, it keeps transport integration simple, testable, and lightweight for applications and services.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

What the package is. innmind/http-transport is the HTTP client abstraction from the Innmind ecosystem — a set of small, composable transport decorators (retry, logging, authentication, etc.) built on Innmind's own Immutable type system and innmind/url value objects rather than on PSR-7/PSR-18. It is a transport layer, not a framework integration: there is no service provider, no facade, no config file, and no Laravel-facing surface of any kind.

Architecture fit. Poor for a conventional Laravel application. Laravel's idiomatic HTTP story is Illuminate\Support\Facades\Http wrapping Guzzle, with first-class support for retries, middleware, fakes in tests, and event dispatching. Adopting this package means introducing a second, parallel HTTP stack with a different request/response object model, a different error model (monadic Either-style returns rather than exceptions), and a different mental model. The core architectural cost is not the dependency itself but the permanent fork in how the team performs outbound I/O.

Integration feasibility. Technically possible — it is a plain Composer package with an MIT license and no framework coupling, so it can be autoloaded and used from a service class. Practically, it does not integrate so much as sit beside Laravel:

  • No Laravel service provider, facade, or publishable config — all wiring is hand-rolled in a container binding.
  • Not PSR-18/PSR-7 compliant, so it cannot reuse Guzzle middleware, Laravel's Http::fake(), Laravel's HTTP events, or any existing PSR-15/PSR-18 tooling (Telescope HTTP watchers, OpenTelemetry auto-instrumentation for Guzzle, etc.).
  • Error handling does not throw; it returns wrapped values the caller must destructure. Every call site becomes a functional-programming exercise, which is a real review and onboarding burden for a team writing ordinary Laravel code.
  • Transitive dependencies on innmind/immutable and related packages pull in their own major-version cadence and API churn.

Technical risk. High, and dominated by supply-chain rather than code quality. The repository shows 1 star and 0 dependents, which means essentially no external production validation, no community bug reports, and no third-party tutorials or Stack Overflow corpus. Combined with a single-maintainer ecosystem and a composite score of ~17/100 (opportunity ~45/100), the realistic risk is that a breaking upstream change or an abandoned repo leaves you maintaining a vendored fork of a library nobody else on the team understands. The 2026-08-23 last-release date also warrants direct verification — a future-dated release suggests either pre-release tagging or unreliable metadata, and either way it should be confirmed against Packagist and the git tags before it appears in a composer.lock.

Key questions to put to the requesting engineer.

  1. What specifically does this give us that Guzzle middleware or Laravel's Http retry/pool APIs do not?
  2. Is there a hard requirement for the Innmind type system elsewhere in the service, or is this an isolated stylistic preference?
  3. Who owns the code if the maintainer stops publishing, and are we prepared to fork and vendor it?
  4. How will outbound calls made through this transport be observed in Telescope/logs/metrics, given it bypasses Laravel's HTTP events?
  5. Does the team have demonstrated fluency with monadic return types in PHP, or is this a first exposure?

Integration Approach

Stack fit. Assume Laravel 10/11 on PHP 8.2+, already carrying Guzzle via the framework. This package is a duplicate capability, not an additive one. A defensible fit exists only in a narrow case: a bounded service or module deliberately written in Innmind's functional style, where the transport is an implementation detail behind an owned port. It is not a fit for shared infrastructure, job queues, or anything a typical Laravel developer will touch.

Migration path. There is no migration — there is an adoption decision. If approved, adopt it additively and narrowly:

  1. Define an application-owned interface (e.g. App\Contracts\OutboundHttpClient) expressed in plain PHP types and Laravel-native exceptions.
  2. Implement that interface in a single adapter class that is the only file allowed to reference Innmind\HttpTransport.
  3. Bind the interface in a service provider; everything else in the codebase depends on the interface, not the package.
  4. Contain it to one bounded context — do not retrofit existing Guzzle call sites.

This "one adapter, one namespace" rule is the only thing that makes the dependency cheap to reverse later, which given the risk profile should be a design requirement, not a guideline.

Compatibility. Verify before anything else: PHP constraint against the runtime version, compatibility with the framework's Guzzle version (they will coexist in the same composer.lock), and whether any Innmind transitive dependency conflicts with an existing package. Because the package does not implement PSR interfaces, there is no interoperability to test — only coexistence. Also confirm the package supports the PHP versions in CI and that composer audit is clean on the full dependency tree.

Sequencing.

  1. Spike (1–2 days). One engineer, one throwaway branch: make a single GET through the package, wrap it in the adapter, and confirm observability story and error surfacing.
  2. Risk review. Confirm release/tag hygiene, maintainer activity, dependency tree health, and a documented fork plan. If any of these fail, stop.
  3. Bounded pilot. Ship the adapter behind a feature flag for one non-critical outbound integration. Establish whether debugging a failed call is tractable for someone who did not write it.
  4. Decide on expansion. Only after the pilot do you consider a second consumer. Default outcome should be "leave it in the pilot box."

Total elapsed time to a safe pilot: roughly one sprint, mostly review rather than coding.

Operational Impact

Maintenance. This is the dominant cost and it is permanent. You are taking on a dependency with no community backstop, so every PHP minor upgrade, every innmind/immutable major bump, and every security advisory in the transitive tree becomes your ticket. Realistically budget a standing allocation of a few engineer-days per quarter to track upstream and validate, plus the unglamorous work of pinning and auditing. Because the package sits outside PSR standards, you cannot substitute a maintained library later without rewriting the adapter — which is precisely why the adapter boundary matters.

Support. No vendor, no SLA, no commercial backing, no meaningful issue-tracker history to search when something breaks. Internal support depends entirely on the one or two engineers who learned it during the spike. That is a bus-factor of one or two for a component on the critical outbound path. Document the adapter, the error-mapping rules, and the fork procedure before the pilot ships — treat the documentation as a deliverable, not an afterthought.

Scaling. Throughput is unlikely to be the problem; the package is thin and the decorator model composes fine. The scaling concerns are organizational: the number of engineers who can safely modify outbound HTTP code, and the ability to add cross-cutting concerns (tracing, circuit breaking, rate limiting) uniformly. With two HTTP stacks in the codebase, every platform-level improvement — a new tracing header, a retry policy standard, a PII redaction rule in logs — must be implemented twice, and the Innmind one will be implemented late or not at all.

Failure modes to design against.

  • Observability gap: calls bypass Laravel's HTTP events and Guzzle middleware, so they are invisible in Telescope and most APM auto-instrumentation. Mitigate with an explicit logging decorator and a custom span, and test that failures are visible in your dashboards.
  • Silent error swallowing: monadic returns that are not explicitly destructured can drop failures on the floor. Enforce a lint/review rule that every adapter response is unwrapped and mapped to an exception.
  • Upstream abandonment: repo goes quiet, a transitive dependency breaks on a PHP upgrade. Mitigate with a pinned version, a mirrored fork, and a documented rebuild path.
  • Knowledge concentration: the original author leaves. Mitigate by requiring two engineers to complete the spike and by keeping the adapter thin enough to reimplement in a day.
  • Dependency drift: Innmind major-version churn forces coordinated upgrades across several packages at once.

Ramp-up. Expect a meaningful ramp for anyone who has not used Innmind's abstractions. A competent Laravel developer will need roughly 2–4 days to become productive with the immutable collections, URL value objects, and non-throwing error style — but only if they are also reading the adapter, which is why the adapter should be small, boring, and heavily commented. Do not expect the wider team to learn it; expect them to learn your interface. The realistic steady state is that a small number of engineers support the package on behalf of everyone else, indefinitely, in exchange for a capability the framework already provides.

Bottom line. From a TPM standpoint the recommendation is do not adopt outside a documented, bounded experiment. The opportunity score (~45/100) suggests a real capability gap in the abstract, but every gap it fills is already filled by Guzzle plus Laravel's HTTP client with vastly better support, observability, and hiring characteristics. Approve the one-sprint spike only if the requesting engineer can articulate a requirement that Guzzle middleware genuinely cannot meet; otherwise, redirect the effort to wrapping the existing client behind an owned interface, which delivers the same decoupling benefit at a fraction of the lifecycle cost.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
socialdept/atp-orm
cboxdk/laravel-assistant-client
socialdept/atp-resolver
socialdept/tenant-domains
tautvydasr/blade-class-names
socialdept/color-scales
maherelgamil/controller
coleus/widgets
coleus/table
coleus/users
coleus/music
coleus/health
coleus/calendar
coleus/notes
coleus/support
coleus/settings
coleus/apps
seampact/laravel
emmyconceptng/laravel-ng-postcode
jjsquady/round-robin