dbstudios/doze
Doze is a small PHP response helper built on Symfony Serializer/HttpFoundation. Configure a serializer + responder to produce encoded responses (e.g., JSON) and use its field selector/attributes support to return only requested fields in API payloads.
Installation
composer require dbstudios/doze
Basic Configuration
Register the serializer and responder in a service provider (e.g., AppServiceProvider):
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Doze\Responder;
public function register()
{
$this->app->singleton('serializer', function () {
return new Serializer([
new DateTimeNormalizer(),
new ObjectNormalizer(),
], [
new JsonEncoder(),
]);
});
$this->app->singleton('responder', function ($app) {
return new Responder($app->make('serializer'));
});
}
First Use Case
Inject the responder into a controller and use it to return JSON responses:
use Doze\Responder;
public function show(Responder $responder)
{
$data = ['name' => 'Example', 'value' => 123];
return $responder->createResponse('json', $data);
}
Normalizing Data
Use ObjectNormalizer for Eloquent models or custom objects:
$normalizer = new ObjectNormalizer();
$normalizer->setIgnoredAttributes(['password', 'created_at']); // Ignore sensitive fields
Custom Serialization
Extend ObjectNormalizer for custom logic:
use Symfony\Component\Serializer\Normalizer\ContextAwareNormalizerInterface;
class CustomNormalizer implements ContextAwareNormalizerInterface
{
public function normalize($object, $format = null, array $context = [])
{
return ['custom_key' => $object->getCustomValue()];
}
// ... (implement other required methods)
}
Response Handling Chain responders for layered responses:
$responder->createResponse('json', $data)
->withHeader('X-Custom-Header', 'value');
Middleware for API Responses Wrap responses globally:
public function handle($request, Closure $next)
{
$response = $next($request);
if ($response instanceof \Symfony\Component\HttpFoundation\Response) {
$responder = app('responder');
return $responder->createResponse('json', $response->getData());
}
return $response;
}
API Resource Integration
Use with Laravel’s JsonResource for consistency:
$responder->createResponse('json', new JsonResource($model));
Error Handling Standardize error responses:
try {
// Risky operation
} catch (\Exception $e) {
return $responder->createResponse('json', [
'error' => $e->getMessage(),
'code' => $e->getCode(),
], 400);
}
Serializer Configuration
DateTimeNormalizer may cause DateTime fields to serialize as strings.DateTimeNormalizer for datetime fields.Circular References
ObjectNormalizer throws CircularReferenceException for nested objects with bidirectional relationships.setCircularReferenceHandler:
$normalizer->setCircularReferenceHandler(function ($object) {
return $object->getId();
});
Deprecated Package
Inspect Serialized Data
Use debug() to verify normalization:
$normalized = $serializer->normalize($object);
dd($normalized);
Check Encoder Support
Ensure the encoder matches the format (e.g., JsonEncoder for 'json').
Custom Responders
Extend Doze\Responder for additional formats (e.g., XML):
class XmlResponder extends Responder
{
public function createResponse($format, $data, $status = 200)
{
$xml = new \SimpleXMLElement('<root/>');
array_walk_recursive($data, function($value, $key) use ($xml) {
$xml->addChild($key, $value);
});
return new Response($xml->asXML(), $status, ['Content-Type' => 'application/xml']);
}
}
Dynamic Normalizers Register normalizers conditionally:
$normalizers = [new ObjectNormalizer()];
if (class_exists(\League\Fractal\Manager::class)) {
$normalizers[] = new FractalNormalizer();
}
$serializer = new Serializer($normalizers, [$encoder]);
Performance
max_depth in ObjectNormalizer.How can I help you explore Laravel packages today?