Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Serializer Bundle Laravel Package

cm2tech/serializer-bundle

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation:

    composer require jms/serializer-bundle
    

    Add the bundle to config/bundles.php:

    return [
        // ...
        JMS\SerializerBundle\JMSSerializerBundle::class => ['all' => true],
    ];
    
  2. First Use Case: Serialize an object to JSON in a controller:

    use JMS\Serializer\SerializerInterface;
    use Symfony\Component\HttpFoundation\JsonResponse;
    
    class MyController extends AbstractController
    {
        public function serializeObject(SerializerInterface $serializer, MyComplexObject $object): JsonResponse
        {
            $json = $serializer->serialize($object, 'json');
            return new JsonResponse($json, 200, [], true);
        }
    }
    
  3. Where to Look First:

    • Official Documentation (focus on "Installation" and "Usage" sections).
    • config/packages/jms_serializer.yaml (default configuration).
    • src/Serializer/ directory (if you need custom serializers/handlers).

Implementation Patterns

Core Workflows

  1. Serialization/Deserialization:

    // Serialize
    $serializer->serialize($data, 'json'); // or 'xml', 'yaml', etc.
    
    // Deserialize
    $deserialized = $serializer->deserialize($json, MyClass::class, 'json');
    
  2. Type-Specific Handling: Use annotations (@Serializer\ExclusionPolicy, @Serializer\Type) or YAML/XML configurations to control serialization behavior:

    # config/packages/jms_serializer.yaml
    jms_serializer:
        metadata:
            directories:
                MyApp:
                    namespace_prefix: "App\\"
                    path: "%kernel.project_dir%/config/serializer"
    
  3. Custom Serializers/Handlers: Extend JMS\Serializer\Context or create custom handlers:

    use JMS\Serializer\Handler\SubscribingHandlerInterface;
    
    class CustomHandler implements SubscribingHandlerInterface
    {
        public static function getSubscribingMethods()
        {
            return [
                [
                    'direction' => SerializationDirection::DESERIALIZATION,
                    'format'    => 'json',
                    'type'      => 'App\Entity\MyEntity',
                    'method'    => 'deserializeMyEntity',
                ],
            ];
        }
    
        public function deserializeMyEntity(DeserializationContext $context)
        {
            // Custom logic
        }
    }
    

    Register in services.yaml:

    services:
        App\Serializer\CustomHandler:
            tags: [jms_serializer.subscribing_handler]
    
  4. API Integration: Use with Symfony’s SerializerAwareTrait or inject SerializerInterface into services:

    use JMS\Serializer\SerializerInterface;
    
    class MyService
    {
        public function __construct(private SerializerInterface $serializer) {}
    
        public function transformData($data): string
        {
            return $this->serializer->serialize($data, 'json');
        }
    }
    
  5. Event Listeners: Hook into serializer.event_dispatcher to modify serialization dynamically:

    use JMS\Serializer\EventDispatcher\EventDispatcher;
    use JMS\Serializer\EventDispatcher\ObjectEvent;
    
    class MyListener
    {
        public function onPreSerialize(ObjectEvent $event)
        {
            $event->getObject()->setProperty('modified', true);
        }
    }
    

    Register in services.yaml:

    services:
        App\Serializer\MyListener:
            tags:
                - { name: kernel.event_listener, event: serializer.event_dispatcher, method: onPreSerialize }
    

Gotchas and Tips

Pitfalls

  1. Circular References: By default, the serializer throws an exception on circular references. Configure circular_reference_handler in jms_serializer.yaml:

    jms_serializer:
        handlers:
            datetime: false
        circular_reference_handler: set # or 'ignore', 'exception'
    
  2. Metadata Caching: Metadata is cached by default in var/cache/dev/jms_serializer. Clear cache after adding new annotations or YAML configs:

    php bin/console cache:clear
    
  3. Annotation vs. YAML:

    • Annotations (@Serializer\*) are processed at runtime and can slow down serialization.
    • YAML/XML configs are compiled into metadata and are faster. Prefer YAML for performance-critical paths.
  4. Deprecated Methods: Avoid JMS\Serializer\Serializer (deprecated). Use SerializerInterface or SerializerBuilder instead.

  5. Symfony 5+ Compatibility: The bundle is compatible with Symfony 5/6, but some older features (e.g., SerializerAwareInterface) may require adjustments.

Debugging Tips

  1. Enable Debug Mode: Set debug: true in jms_serializer.yaml to log metadata generation:

    jms_serializer:
        debug: true
    
  2. Inspect Metadata: Dump metadata for a class:

    $metadataFactory = $serializer->getMetadataFactory();
    $metadata = $metadataFactory->getMetadataFor('App\Entity\MyEntity');
    dump($metadata);
    
  3. Common Errors:

    • "No serializer found for class...": Ensure the class is registered in metadata (annotations/YAML) or implement JMS\Serializer\SerializationContext.
    • "Invalid format...": Verify the format string (e.g., 'json', 'xml') matches a registered handler.

Extension Points

  1. Custom Formats: Register new formats via serializer.format_handlers:

    services:
        app.custom_serializer:
            class: App\Serializer\CustomSerializer
            tags: [jms_serializer.format_handler, jms_serializer.format_handler_name: 'custom']
    
  2. Metadata Customization: Override metadata directories or factories:

    jms_serializer:
        metadata:
            directories:
                MyApp:
                    path: "%kernel.project_dir%/config/serializer"
                    namespace_prefix: "App\\"
            cache: false # Disable caching for development
    
  3. Performance Optimization:

    • Use SerializerBuilder to pre-configure the serializer with handlers/contexts.
    • Disable unused handlers (e.g., datetime, dateinterval) in jms_serializer.yaml.
  4. Testing: Mock SerializerInterface in tests:

    $serializer = $this->createMock(SerializerInterface::class);
    $serializer->method('serialize')->willReturn('{"data":"test"}');
    
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
unabomber/timezone
delatbabel/contacts
astritzeqiri/g-recaptcha
kevinongko/laravel-genode
developeruz/laravel-analytics
robbiep/afterthedeadline
frankkessler/incontact-laravel-oauth2-rest
jlxh/laravel-userlog
davidmgilo/timetables
qylinfly/role-permission
reflect-digital/conduit
takashato/laravel-vietqr
aitor24/laralang
kraenzle-ritter/entity-relations
dindigital/din-image
pomirleanu/image-colors
sawmainek/laravel-api-generator
delatbabel/jsonresponses
mouhamedfd/permissions-generator
eduplus/qr