Weave Code
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

alexmanno/serializer-bundle

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation Add the bundle via Composer:

    composer require jms/serializer-bundle
    

    Register the bundle in config/bundles.php (Symfony 4+):

    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 show(MyEntity $entity, SerializerInterface $serializer): JsonResponse
        {
            return new JsonResponse($serializer->serialize($entity, 'json'));
        }
    }
    
  3. Where to Look First

    • Documentation: Official JMS Serializer Docs
    • Configuration: config/packages/jms_serializer.yaml (auto-generated)
    • Annotations: @SerializedName, @Groups, @ExclusionPolicy

Implementation Patterns

Core Workflows

  1. Serialization

    • Basic: $serializer->serialize($data, 'json')
    • With Groups: $serializer->serialize($data, 'json', ['groups' => ['group1', 'group2']])
    • Custom Format: Configure in config/packages/jms_serializer.yaml:
      jms_serializer:
          handlers:
              datetime:
                  default_strategy: ~
      
  2. Deserialization

    • Basic: $serializer->deserialize($json, 'App\Entity\MyEntity', 'json')
    • With Context: Pass an array of options (e.g., ['groups' => ['group1']]).
  3. Entity Serialization

    • Use Doctrine Metadata for automatic field mapping:
      jms_serializer:
          metadata:
              directories:
                  App\Entity:
                      namespace_prefix: "App\\Entity"
                      path: "%kernel.project_dir%/config/serializer"
      
    • Create YAML/XML/Annotation metadata files (e.g., App\Entity\MyEntity.yaml):
      App\Entity\MyEntity:
          exclusion_policy: ALL
          properties:
              id:
                  expose: true
                  groups: [Default]
              name:
                  expose: true
                  groups: [Default, Detail]
      
  4. API Responses

    • Symfony 4+: Use SerializerAwareTrait or inject SerializerInterface:
      use JMS\Serializer\SerializerInterface;
      
      public function __construct(private SerializerInterface $serializer) {}
      
      public function show(MyEntity $entity): JsonResponse
      {
          return new JsonResponse($this->serializer->serialize($entity, 'json', ['groups' => ['api']]));
      }
      
    • FOSRestBundle: Integrate with FOS\RestBundle\View\View:
      return $this->view($entity, 200, [], ['groups' => ['api']]);
      
  5. Custom Handlers

    • Primitive Types: Override default handlers (e.g., for DateTime):
      jms_serializer:
          handlers:
              datetime:
                  default_strategy: "App\Serializer\Handler\DateTimeHandler"
      
    • Custom Logic: Implement 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
          }
      }
      
  6. Event Listeners

    • Pre/Post Serialization: Use JMS\Serializer\EventDispatcher\ObjectEvent:
      use JMS\Serializer\EventDispatcher\ObjectEvent;
      
      $dispatcher->addSubscriber(new class() {
          public function onPostSerialize(ObjectEvent $event)
          {
              if ($event->getObject() instanceof MyEntity) {
                  $event->getVisitor()->addData(['custom_field' => 'value']);
              }
          }
      });
      

Integration Tips

  1. Doctrine Integration

    • Enable automatic metadata generation:
      jms_serializer:
          metadata:
              directories:
                  App\Entity:
                      namespace_prefix: "App\\Entity"
                      path: "%kernel.project_dir%/config/serializer"
                      type: "yaml"
      
    • Generate metadata for all entities:
      php bin/console jms:serializer:update
      
  2. Symfony Forms

    • Use JMS\Serializer\SerializationContext with forms:
      $context = SerializationContext::create()
          ->setGroups(['form'])
          ->setSerializeNull(true);
      $serializer->serialize($form, 'json', $context);
      
  3. API Versioning

    • Use serialization groups to version responses:
      // Entity annotation
      /** @Groups({"api_v1", "api_v2"}) */
      private $id;
      
      /** @Groups({"api_v2"}) */
      private $newField;
      
      // Controller
      $serializer->serialize($entity, 'json', ['groups' => ['api_v1']]);
      
  4. Caching

    • Cache metadata for performance:
      jms_serializer:
          metadata:
              cache: "file" # or "apcu", "memcache"
              cache_dir: "%kernel.project_dir%/var/cache/jms_serializer"
      

Gotchas and Tips

Common Pitfalls

  1. Circular References

    • Issue: Infinite loops when serializing entities with bidirectional relationships.
    • Fix: Use @MaxDepth annotation or configure max depth in context:
      $context = SerializationContext::create()->setMaxDepth(2);
      
  2. Null Values

    • Issue: Null values may be excluded by default.
    • Fix: Configure serialize_null in config/packages/jms_serializer.yaml:
      jms_serializer:
          handlers:
              JMS\Serializer\Handler\ArrayHandler:
                  serialize_null: true
      
    • Per-Serialization: Pass ['serialize_null' => true] to the serializer.
  3. Doctrine Proxy Objects

    • Issue: Serializing proxies may cause errors or infinite loops.
    • Fix: Use @ExclusionPolicy(ExclusionPolicy::ALL) and manually expose required fields.
  4. Type Mismatches

    • Issue: Deserialization fails due to type conflicts (e.g., string vs. int).
    • Fix: Use @Type annotation or custom handlers:
      /** @Type("string") */
      private $id;
      
  5. Configuration Overrides

    • Issue: Global config overrides per-serialization settings.
    • Fix: Always pass context explicitly:
      $serializer->serialize($data, 'json', ['groups' => ['custom']]);
      
  6. XML Serialization

    • Issue: Blank XML or malformed output.
    • Fix: Configure format_output:
      jms_serializer:
          handlers:
              JMS\Serializer\Handler\XmlHandler:
                  format_output: true
      
  7. Symfony 4+ Autowiring

    • Issue: SerializerInterface not autowired.
    • Fix: Ensure the bundle is registered in config/bundles.php and use:
      use JMS\Serializer\SerializerInterface;
      

Debugging Tips

  1. Enable Debug Mode

    • Set JMS_SERIALIZER_DEBUG environment variable to log serialization issues.
  2. Check Metadata

    • Verify metadata files are generated and correct:
      php bin/console debug:container jms_serializer.metadata.directory.App_Entity
      
  3. Inspect Context

    • Dump the serialization context to debug:
      $context = SerializationContext::create()->setGroups(['debug']);
      $serializer->serialize($data, 'json', $context);
      
  4. Handle Exceptions

    • Catch JMS\Serializer\Exception\RuntimeException for runtime errors:
      try {
          $serializer->serialize($data, 'json');
      } catch (\Exception $e) {
          // Log or handle error
      }
      

Extension Points

  1. Custom Metadata
    • Extend metadata with YAML/XML/Annotations:
      # config/serializer/App\Entity/MyEntity.yaml
      App\Entity\MyEntity:
          properties:
      
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.
emuniq/filament-browser-notifications
syriable/filament-translator
hungnm28/livewire-form
wenprise/eloquent
crudly/encrypted
fadion/bouncy
cuci/prototurk-sdk
gos/pubsub-router-bundle
cuci/prototurk-sdk-symfony
clementtalleu/easyadmin-markdown-bundle
codeflextech/permission-manager
karnoweb/livewire-datepicker
sayedenam/sayed-dashboard
milito/query-filter
apiboxsym/user-bundle
apiboxsym/health-check-bundle
jayeshmepani/jpl-moshier-ephemeris-php
elnasnato/laraliveui
labrodev/rest-sdk
sampaui/sampaui