Installation:
composer require egeloen/serializer-bundle
Add the bundle to config/bundles.php in Laravel (via App\Providers\SerializerServiceProvider if using a custom provider wrapper):
Egeloen\SerializerBundle\SerializerBundle::class,
Basic Usage: Serialize an object to JSON (default format):
use Egeloen\SerializerBundle\Serializer\Serializer;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
$serializer = app(Serializer::class);
$data = ['name' => 'John', 'age' => 30];
$json = $serializer->serialize($data, 'json');
First Use Case: Convert Eloquent models to JSON for API responses:
$user = User::find(1);
return response()->json($serializer->serialize($user, 'json'));
API Response Serialization:
Use Serializer in controllers to standardize API responses:
public function show(User $user)
{
return response()->json(
$this->serializer->serialize($user, 'json', [
'groups' => ['api']
])
);
}
Request Deserialization: Parse incoming JSON/XML/YAML requests:
$data = $this->serializer->deserialize(
$request->getContent(),
'stdClass',
'json'
);
Normalization Groups:
Define groups in entities (e.g., #[Groups(['api'])]) and use them in serialization:
$serializer->serialize($entity, 'json', ['groups' => ['api', 'internal']]);
Custom Encoders/Normalizers: Register additional formats (e.g., CSV) via config:
# config/packages/egeloen_serializer.yaml
egeloen_serializer:
encoders:
csv: ~
normalizers:
csv: Egeloen\SerializerBundle\Normalizer\CsvNormalizer
Event Listeners:
Hook into serializer.post_serialize/serializer.post_deserialize events for pre/post-processing:
$serializer->addListener('serializer.post_serialize', function ($event) {
$event->getData()['timestamp'] = now()->toIso8601String();
});
Laravel HTTP Responses:
Use SerializerInterface with Laravel’s Response helper:
return response($serializer->serialize($data, 'json'), 200, [
'Content-Type' => 'application/json',
]);
Form Requests:
Deserialize request data in handle():
$data = $this->serializer->deserialize(
$request->getContent(),
StoreUserRequest::class,
'json'
);
Queue Jobs: Serialize payloads for delayed processing:
$job = new ProcessOrder($serializer->serialize($order, 'json'));
dispatch($job);
Circular References:
Default behavior throws CircularReferenceException. Use max_depth or custom handlers:
$serializer->serialize($data, 'json', [
'circular_reference_handler' => function ($object) {
return $object->getId();
}
]);
Date Handling:
Dates serialize as ISO strings by default. Override with a custom normalizer or use DateTimeNormalizer:
egeloen_serializer:
normalizers:
datetime: Symfony\Component\Serializer\Normalizer\DateTimeNormalizer
XML Namespaces: XML serialization may require explicit namespace handling:
$serializer->serialize($data, 'xml', [
'xml_format_output' => true,
'xml_root_node_name' => 'root',
]);
Performance:
Avoid serializing large objects (e.g., collections) without pagination. Use max_depth or partial serialization:
$serializer->serialize($user->posts, 'json', ['max_depth' => 1]);
Enable Debug Mode:
egeloen_serializer:
debug: true
Logs serialization/deserialization events to var/log/dev.log.
Check Normalizer Order:
Use Serializer::getNormalizers() to debug which normalizers are applied. Reorder via config:
egeloen_serializer:
normalizers:
order:
- Egeloen\SerializerBundle\Normalizer\ObjectNormalizer
- App\Normalizer\CustomNormalizer
Custom Normalizers:
Extend Symfony\Component\Serializer\Normalizer\NormalizerInterface and register:
$serializer->addNormalizer(new App\Normalizer\MyNormalizer());
Context Overrides: Dynamically modify serialization context in middleware:
$serializer->setContext([
'groups' => request()->header('accept') === 'internal' ? ['internal'] : ['api']
]);
Event Subscribers: Modify serialized data globally:
$serializer->addSubscriber(new class implements EventSubscriberInterface {
public function getSubscribedEvents() {
return ['serializer.post_serialize'];
}
public function onPostSerialize(PostSerializeEvent $event) {
$event->getData()['meta'] = ['version' => '1.0'];
}
});
CSV Quirks:
CSV serialization requires arrays or objects with getCsvData() method. For custom objects:
$serializer->serialize($data, 'csv', [
'csv_associative' => true,
'csv_headers' => ['id', 'name']
]);
Default Format: Override the default format (JSON) in config:
egeloen_serializer:
default_format: xml
Encoder Priorities:
Ensure encoders are registered before normalizers. Use encoder key in config:
egeloen_serializer:
encoders:
yaml: Symfony\Component\Serializer\Encoder\YamlEncoder
Cache Normalizers:
Enable caching for performance (requires symfony/cache):
egeloen_serializer:
normalizers:
cache: true
How can I help you explore Laravel packages today?