metaer/curl-wrapper-bundle
Symfony bundle that integrates the Metaer Curl Wrapper library, adding dependency-injection configuration and a ready-to-use HTTP client service for making cURL requests in PHP applications.
Architecture fit
Symfony\Component\HttpKernel\Bundle\Bundle plus a DI extension that loads service definitions. Laravel has no bundle registration, no config/bundles.php, and no container extension semantics — PSR-11 interop gets you a container, not a bundle loader.Symfony\Component\DependencyInjection\Alias::setPrivate() → setPublic(). That is a fix to the DI extension layer — precisely the layer we would delete on day one. The release tells us where the maintainer's attention is, and it is not on the HTTP client.ext-curl). Everything else in the repo is Symfony scaffolding we would delete.Integration feasibility
ServiceProvider. Budget half a day for the spike, one to two days for a productionized adapter with tests.symfony/dependency-injection 5.2 deprecations, which implies the maintainer is now developing against Symfony ≥ 5.2 — but the release note does not state whether composer.json constraints moved. A constraint bump here could newly pull Symfony 5.4/6 components that conflict with what Laravel 10/11 already resolve. We cannot assume the dependency picture is unchanged; re-read composer.json before anything else.symfony/framework-bundle at runtime (not just require-dev), extraction is mandatory, not optional. 1.0.6 gives no evidence either way.Technical risk
CURLOPT_SSL_VERIFYPEER => false), where timeouts are omitted so workers hang, and where curl_exec returns false instead of throwing. These are exactly the failure modes that don't show up until production traffic. 1.0.6 touches none of them.curl_close no-ops) as still present.Illuminate\Support\Facades\Http (Guzzle) with fakes, retries, middleware, pooling, and ->withOptions(['curl' => ...]) escape hatches.Key questions
composer.json constraints (php, symfony/*) alongside the DI fix — and does symfony/framework-bundle remain a runtime requirement?curl_multi / concurrency, or is it strictly blocking single-request?curl request option does not — and has 1.0.6 changed that answer? (Current answer: no.)Stack fit
CurlHandler instead.App\Http\Contracts\HttpClient interface, a CurlHttpClient implementation (extracted code), bound as a singleton, with a fake implementation for tests.Migration path
composer.json against the pre-1.0.6 state. The constraint question is now the first thing to check, not the last.php artisan tinker with no container involvement. Confirms whether the class is standalone.app/Support/Http/ (or a private first-party package), strip Symfony annotations/DI, add strict types, fix PHP 8.x deprecations.Http::fake() for timeout, TLS failure, 4xx/5xx, and malformed-response behavior. Do not treat 1.0.6 as a correctness signal; the release note gives no reason to believe HTTP behavior changed.Http client and delete.Compatibility
ext-curl in our runtime image; confirm no reliance on libcurl features absent from our base image.Sequencing
Maintenance
Support
Scaling
curl_multi. Under load this is measurably worse than Guzzle's pooled handler.Failure modes
curl_exec returning false with no exception → silent bad data propagation. Not addressed in 1.0.6.composer update in a fork could resolve a different component graph than the one we validated — pin the fork.Ramp-up
composer.json for constraint drift from 1.0.6, then use the package as a reference implementation at most. Keep Laravel's HTTP client; if a raw-curl capability is genuinely required, close that gap with Guzzle's curl request option or a small first-party adapter we own.How can I help you explore Laravel packages today?