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>