aescarcha/serializer
Symfony bundle that simplifies entity serialization using symfony/serializer, with optional fallback loading from Doctrine when relations or data aren’t initialized. Installs via Composer and registers as a service and bundle.
Installation
composer require aescarcha/serializer
Ensure your project uses Symfony 4+ (or 3.x with Flex) and Doctrine ORM.
Register the Bundle
Add to config/bundles.php:
return [
// ...
Aescarcha\SerializerBundle\AescarchaSerializerBundle::class => ['all' => true],
];
First Use Case Inject the serializer service into a controller or service:
use Aescarcha\SerializerBundle\Serializer\SerializerService;
class MyController extends AbstractController
{
public function __construct(private SerializerService $serializer)
{
}
public function serializeEntity(EntityInterface $entity): string
{
return $this->serializer->serialize($entity);
}
}
Key Configuration
The bundle auto-configures with Doctrine ORM. No additional services.yml is needed in Symfony 4+ (Flex handles it). For manual setups, ensure:
# config/services.yaml
services:
Aescarcha\SerializerBundle\Serializer\SerializerService:
arguments:
$entityManager: '@doctrine.orm.entity_manager'
Basic Serialization Serialize an entity to JSON/array with default groups:
$serialized = $this->serializer->serialize($entity, 'json');
// or
$serialized = $this->serializer->toArray($entity);
Custom Groups
Use Symfony’s #[Groups] attribute or pass groups explicitly:
$this->serializer->serialize($entity, 'json', ['groups' => ['api']]);
Fallback to Database If an entity is missing data (e.g., lazy-loaded relations), the bundle fetches missing fields from the DB:
$this->serializer->serialize($entity, 'json', ['fallback_to_db' => true]);
Deserialization Reconstruct an entity from serialized data:
$entity = $this->serializer->deserialize($serializedData, EntityClass::class, 'json');
API Platform Integration
Override API Platform’s default serializer by configuring the bundle’s service as the primary serializer in config/packages/api_platform.yaml:
api_platform:
serializer:
service: aescarcha.serializer
Event Listeners Attach listeners to pre/post-serialize events for custom logic:
$serializer->addSerializerListener(new CustomSerializeListener());
Normalizers Extend functionality by registering custom normalizers:
$serializer->addNormalizer(new CustomNormalizer());
Circular References
Handle circular references with ignore_circular_references:
$this->serializer->serialize($entity, 'json', ['ignore_circular_references' => true]);
Doctrine Dependency
EntityManager not found.doctrine/orm is installed and configured.Fallback to DB Overhead
fallback_to_db triggers additional queries for missing data, which can impact performance.Symfony\Contracts\Cache\CacheInterface).Test Environment Issues
SerializerService in tests:
$this->serializer = $this->createMock(SerializerService::class);
$this->serializer->method('serialize')->willReturn('{"id":1}');
Attribute Overrides
#[Groups] over manual group configurations. Explicitly pass groups to override:
$this->serializer->serialize($entity, 'json', ['groups' => ['override']]);
Symfony 5+ Deprecations
#[AsArrayProperty]).symfony/serializer version for compatibility.Enable Serializer Debugging
Add this to config/packages/dev/serializer.yaml:
framework:
serializer:
debug: true
Logs will show normalization groups and circular references.
Common Errors
| Error | Cause | Solution |
|---|---|---|
No serializer found |
Missing #[Groups] or custom normalizer |
Add #[Groups] or register a normalizer. |
EntityManager not found |
Doctrine not installed/configured | Install doctrine/orm and update config. |
Circular reference detected |
Infinite recursion in entities | Use ignore_circular_references: true. |
Custom Serializer
Extend SerializerService to add domain-specific logic:
class CustomSerializer extends SerializerService
{
public function serializeWithExtraData($entity, $format, array $context = [])
{
$context['extra'] = $this->getExtraData($entity);
return parent::serialize($entity, $format, $context);
}
}
Dynamic Groups Generate groups dynamically based on user roles:
$groups = $this->security->isGranted('ROLE_ADMIN') ? ['admin', 'api'] : ['api'];
$this->serializer->serialize($entity, 'json', ['groups' => $groups]);
Cache Serialized Output Cache results to avoid repeated serialization:
$cacheKey = md5($entity->getId().serialize($groups));
$serialized = $cache->get($cacheKey, function() use ($entity, $groups) {
return $this->serializer->serialize($entity, 'json', ['groups' => $groups]);
});
How can I help you explore Laravel packages today?