Installation:
composer require bugloos/responder-bundle
Ensure your project meets the requirements (PHP 8.0+, Symfony 4.4+).
Bundle Registration:
Add to config/bundles.php:
Bugloos\ResponderBundle\BugloosResponderBundle::class => ['all' => true],
First Use Case: Replace default Symfony responses in controllers with standardized responders. Example:
use Bugloos\ResponderBundle\Responder\JsonResponder;
class ApiController extends AbstractController
{
public function show(User $user, JsonResponder $responder)
{
return $responder->respond([
'data' => $user->toArray(),
'meta' => ['status' => 'success']
]);
}
}
Key Files:
src/Responder/ for core responder classes.config/packages/bugloos_responder.yaml for bundle configuration.Controller Integration:
JsonResponder, HtmlResponder).return $responder->respond($data, Response::HTTP_CREATED, ['Location' => '/users/1']);
Custom Response Formatting:
JsonResponder) to add domain-specific logic:
class ApiJsonResponder extends JsonResponder
{
protected function customizeResponse(array $data, int $status): array
{
return array_merge($data, ['timestamp' => now()->toIso8601String()]);
}
}
Error Handling:
try {
$user = User::findOrFail($id);
} catch (NotFoundHttpException $e) {
return $responder->error('User not found', Response::HTTP_NOT_FOUND);
}
View Integration:
HtmlResponder with Twig:
return $htmlResponder->render('user/show', ['user' => $user]);
Middleware Integration:
api-platform/core for automatic responder integration.Configuration Overrides:
bugloos_responder.yaml may conflict with custom responder logic. Always check:
bugloos_responder:
default_status: 200 # Overrides global default
Response Headers:
return $responder->respond($data, Response::HTTP_OK, ['X-Custom-Header' => 'value']);
Caching:
Symfony 5.4+:
ResponseListener to log responses:
$this->container->get('debug.stopwatch')->lap('responder');
respond() is called with valid data.Custom Responders:
XmlResponder):
class XmlResponder extends AbstractResponder
{
public function respond($data, int $status = 200, array $headers = []): Response
{
$xml = new \SimpleXMLElement('<response/>');
// ... transform $data to XML
return new Response($xml->asXML(), $status, $headers);
}
}
services:
Bugloos\ResponderBundle\Responder\XmlResponder:
tags: ['controller.service_arguments']
Event Listeners:
responder.response events to modify responses globally:
public function onResponderResponse(ResponderEvent $event)
{
$event->setResponse($event->getResponse()->withHeader('X-Processed', 'true'));
}
Configuration:
config/packages/bugloos_responder.yaml:
bugloos_responder:
responders:
json: App\Responder\ApiJsonResponder
How can I help you explore Laravel packages today?