1

Je ne parviens pas à remplacer les gestionnaires par défaut dans le bundle jms serializer.Impossible de remplacer le gestionnaire par défaut de JMS Serializer pour Symfony ConstraintViolationList

Je voudrais changer la façon dont Symfony\Component\Validator\ConstraintViolationList est sérialisé, donc j'ai écrit mon propre gestionnaire personnalisé. Et étiqueté correctement comme décrit dans la documentation (et dans diverses réponses stackoverflow).

Toutefois, mon gestionnaire continue d'être remplacé par le gestionnaire par défaut de ConstraintViolationList fourni avec le bundle JMS Serializer.

J'ai correctement étiqueté mon service de gestionnaire. En fait, mon service de gestionnaire est détecté et utilisé correctement lorsque je commente sur la définition du service ms_serializer.constraint_violation_handler de vendor/jms/serializer-bundle/JMS/SerializerBundle/Resources/config/services.xml

Comment puis-je arrêter le gestionnaire par défaut de mon remplaçant un personnalisé?

J'ai même essayé de remplacer le paramètre jms_serializer.constraint_violation_handler.class de mon propre paquet mais toujours pas de chance.

Voici ma classe Handler:

<?php 
namespace Coanda\Bridge\JMSSerializer\Handler; 

use JMS\Serializer\Context; 
use JMS\Serializer\GraphNavigator; 
use JMS\Serializer\Handler\SubscribingHandlerInterface; 
use JMS\Serializer\JsonSerializationVisitor; 
use Symfony\Component\Validator\ConstraintViolation; 
use Symfony\Component\Validator\ConstraintViolationList; 

class ConstraintViolationHandler implements SubscribingHandlerInterface 
{ 
    public static function getSubscribingMethods() 
    { 
     $methods = []; 
     $methods[] = [ 
      'direction' => GraphNavigator::DIRECTION_SERIALIZATION, 
      'type' => ConstraintViolationList::class, 
      'format' => 'json', 
      'method' => 'serializeListToJson' 
     ]; 
     return $methods; 
    } 

    public function serializeListToJson(
     JsonSerializationVisitor $visitor, 
     ConstraintViolationList $list, 
     array $type, 
     Context $context 
    ) { 
     $violations = []; 
     foreach ($list as $item) { 
      $violations[$item->getPropertyPath()][] = $item->getMessage(); 
     } 
     if (null === $visitor->getRoot()) { 
      $visitor->setRoot($violations); 
     } 
     return $violations; 
    } 

} 

Je me suis inscrit dans mon services.xml

<service id="coanda.serializer.constraint_violation_handler" 
     class="Coanda\Bridge\JMSSerializer\Handler\ConstraintViolationHandler"> 
     <tag name="jms_serializer.subscribing_handler" 
      type="Symfony\Component\Validator\ConstraintViolationList" 
      direction="serialization" format="json" method="serializeListToJson" /> 
    </service> 

Répondre

0

Ce qui se passait parce que JMSSerializerBundle a été enregistré après mon paquet dans AppKernel ce qui veut dire que quel que soit le service que je define sera surchargé par la version de JMS Serializer.

Solution: mettre votre paquet au bas dans AppKernel.php comme ceci:

public function registerBundles() 
{ 
    $bundles = [ 
     // ....... 
     new JMS\SerializerBundle\JMSSerializerBundle(), 
     new My\Bundle\MyAwesomeBundle() 
    ]; 

    return $bundles; 
}