psr-discovery/http-client-implementations
Discovers an installed PSR-18 HTTP client at runtime by checking for well-known implementations and returning the first available instance. Ideal for SDKs/libraries to support PSR-18 without hard dependencies or extra user configuration.
illuminate/http-client, symfony/http-client), which are already supported by this package.composer require and minimal boilerplate (Discover::httpClient()). No configuration files or complex setup.HttpClient facade) without conflicts, as it operates at the PSR-18 interface level.php-http/mock-client) for unit testing, aligning with Laravel’s testing best practices (e.g., Mockery or PHPUnit mocks).returns null) if no PSR-18 implementation is installed. This requires fallback logic in the TPM’s architecture (e.g., defaulting to Laravel’s HttpClient or throwing a descriptive exception).class_exists() checks) adds minimal overhead, but singleton caching (Discover::httpClient(singleton: true)) mitigates this for repeated calls.^9.0 requiring Symfony 6+) may limit flexibility. Validate compatibility during integration.Clients::use('symfony/http-client')).Primary Use Case:
HttpClient)?Clients::use('guzzlehttp/guzzle')) or rely on discovery.Fallback Strategy:
null returns (e.g., no PSR-18 client installed)?HttpClient, throw an exception, or require explicit client installation.Testing Strategy:
Performance Sensitivity:
singleton: true for high-frequency use cases.Client Preference:
Laravel Compatibility:
symfony/http-client in Laravel 9+) and third-party clients (e.g., Guzzle).$this->app->bind(\Psr\Http\Client\ClientInterface::class, function ($app) {
return Discover::httpClient(singleton: true);
});
Discover::httpClient() in a custom facade (e.g., HttpClientDiscovery) for consistency with Laravel’s Http facade.Existing Laravel HTTP Stack:
HttpClient facade for convenience methods (e.g., get(), post()).Discover::httpClient() in new services/SDKs, then gradually replace direct client instantiations.Phase 1: Discovery in SDKs/Libraries
new GuzzleHttp\Client()) with Discover::httpClient() in internal libraries or third-party SDKs.PaymentGateway service using this package instead of new GuzzleHttp\Client().Phase 2: Application-Level Adoption
HttpClient usage in services/controllers with the discovered client where PSR-18 compliance is sufficient.Phase 3: Testing Integration
phpunit.xml or composer.json dev dependencies:
"require-dev": {
"php-http/mock-client": "^1.5"
}
Clients::use('php-http/mock-client') in tests to enforce mock usage.Laravel Versions:
symfony/http-client:^5.0).Client-Specific Features:
$client = Discover::httpClient();
$client = $client->withConfig(['timeout' => 30]); // Client-specific config
Legacy Code:
file_get_contents(), curl_init()) remain unaffected.Dependency Installation:
psr-discovery/http-client-implementations and a primary PSR-18 client (e.g., symfony/http-client).composer require psr-discovery/http-client-implementations symfony/http-client
Service Registration:
Gradual Replacement:
Testing Setup:
Monitoring:
null returns) to identify missing clients early.Pros:
composer update in the host project.Cons:
null returns) require checking multiple dependencies (host project + installed clients).Recommendations:
Discover::httpClient() returns null, install symfony/http-client").Clients::use('symfony/http-client') explicitly.composer why-not psr-discovery/http-client-implementations to debug dependency conflicts.$client = Discover::httpClient();
if (!$client) {
logger()->error('No PSR-18
How can I help you explore Laravel packages today?