Installation:
composer require bywulf/guzzle-bundle
Add to config/bundles.php:
return [
// ...
byWulf\CsaGuzzleBundle\CsaGuzzleBundle::class => ['all' => true],
];
Basic Configuration:
Define a client in config/packages/csa_guzzle.yaml:
csa_guzzle:
clients:
api:
base_uri: 'https://api.example.com'
timeout: 30
options:
headers:
'Accept': 'application/json'
First Use Case: Inject the client into a service and make a request:
use Symfony\Component\HttpFoundation\Response;
class ApiClient
{
public function __construct(private \GuzzleHttp\ClientInterface $apiClient) {}
public function fetchData(): Response
{
$response = $this->apiClient->get('/endpoint');
return new Response($response->getBody());
}
}
/_profiler).config/packages/csa_guzzle.yaml for client-specific settings.Implementation Patterns).Client Configuration:
Define multiple clients in config/packages/csa_guzzle.yaml:
csa_guzzle:
clients:
auth:
base_uri: 'https://auth.example.com'
timeout: 10
middleware:
- csa_guzzle.middleware.logger
- csa_guzzle.middleware.profiler
Middleware Integration: Enable middleware globally or per-client:
csa_guzzle:
middleware:
default:
- csa_guzzle.middleware.cache # Cache responses
- csa_guzzle.middleware.mock # For testing
Service Injection: Use autowiring or explicit binding:
// services.yaml
services:
App\Service\ApiService:
arguments:
$client: '@csa_guzzle.client.api'
Async Requests: Leverage Guzzle’s promise API:
$promise = $this->apiClient->getAsync('/data');
$promise->then(function ($response) {
// Handle response
});
use byWulf\CsaGuzzleBundle\Event\GuzzleEvent;
class CustomSubscriber implements SubscriberInterface
{
public static function getSubscribedEvents()
{
return [
GuzzleEvent::PRE_REQUEST => 'onPreRequest',
];
}
public function onPreRequest(GuzzleEvent $event)
{
$event->getRequest()->setHeader('X-Custom', 'Header');
}
}
csa_guzzle.middleware.cache with Symfony’s cache system:
csa_guzzle:
clients:
cached_api:
middleware:
- csa_guzzle.middleware.cache:
cache_pool: 'app.cache.array'
csa_guzzle.middleware.mock:
csa_guzzle:
clients:
test_api:
middleware:
- csa_guzzle.middleware.mock:
responses:
GET:/test: '{"status":"ok"}'
Middleware Order:
Middleware executes in the order defined. Place profiler early to capture full request/response cycles:
middleware:
- csa_guzzle.middleware.profiler
- csa_guzzle.middleware.logger
Debug Toolbar Visibility:
Ensure APP_DEBUG=true in .env to see Guzzle requests in the toolbar. Profiler data may not appear in production.
Deprecated Features:
service_descriptions (from 1.x) is not available in 2.x/3.x. Use custom middleware for API documentation.PHP 8.0+ Compatibility:
While this fork supports PHP 8.0, some middleware (e.g., mock) may require adjustments for named arguments.
Log Middleware: Enable logging for all requests:
csa_guzzle:
middleware:
default:
- csa_guzzle.middleware.logger:
log_level: debug
Check var/log/dev.log for Guzzle activity.
Profiler Data: If the toolbar shows no Guzzle data:
csa_guzzle.middleware.profiler is enabled.php bin/console cache:clear).Timeout Errors:
Default timeout is 30 seconds. Adjust per-client:
clients:
slow_api:
timeout: 60
Custom Middleware: Create a middleware class and register it:
use byWulf\CsaGuzzleBundle\Middleware\MiddlewareInterface;
class CustomHeaderMiddleware implements MiddlewareInterface
{
public function __invoke(callable $handler)
{
return function ($request, $options) use ($handler) {
$request = $request->withHeader('X-Custom', 'Value');
return $handler($request, $options);
};
}
}
Register in services.yaml:
services:
app.custom_middleware:
class: App\Middleware\CustomHeaderMiddleware
tags:
- { name: csa_guzzle.middleware }
Override Default Clients:
Extend or replace default clients in config/packages/overrides/csa_guzzle.yaml:
csa_guzzle:
clients:
api:
base_uri: '%env(API_URL)%'
Event Subscribers:
Extend functionality via GuzzleEvent:
use byWulf\CsaGuzzleBundle\Event\GuzzleEvent;
class RetrySubscriber implements SubscriberInterface
{
public static function getSubscribedEvents()
{
return [GuzzleEvent::POST_RESPONSE => 'onPostResponse'];
}
public function onPostResponse(GuzzleEvent $event)
{
if ($event->getResponse()->getStatusCode() === 429) {
$event->retry();
}
}
}
base_uri overrides bundle defaults. Avoid duplicate paths:
# Bad: Duplicate base_uri
clients:
api:
base_uri: 'https://api.example.com/v1'
api_v2:
base_uri: 'https://api.example.com/v1' # Overrides v1
byWulf\CsaGuzzleBundle\Middleware\LoggerMiddleware) if conflicts arise.profiler) in production to reduce overhead:
csa_guzzle:
middleware:
default: [] # Disable all
How can I help you explore Laravel packages today?