Ich kann Standard-Handler im JMS-Serializer-Bundle nicht überschreiben.JMS-Serializer-Standardhandler für Symfony ConstraintViolationList kann nicht überschrieben werden
Ich möchte den Weg ändern Symfony\Component\Validator\ConstraintViolationList
ist serialisiert, so schrieb ich meine eigenen benutzerdefinierten Handler. Und es richtig markiert, wie in der Dokumentation beschrieben (und in verschiedenen Stackoverflow-Antworten).
Mein Handler wird jedoch weiterhin vom Standardhandler für ConstraintViolationList überschrieben, mit dem das JMS-Serializer-Bundle ausgeliefert wird.
Ich habe meine Handler-Service korrekt markiert. In der Tat ist mein Handler erkannt und kommentieren Sie ms_serializer.constraint_violation_handler
Service-Definition richtig, wenn ich von vendor/jms/serializer-bundle/JMS/SerializerBundle/Resources/config/services.xml
verwendet
Wie kann ich die Standard-Handler eines überschreiben meiner Gewohnheit zu stoppen?
Ich habe sogar versucht, jms_serializer.constraint_violation_handler.class
Parameter aus meinem eigenen Bündel, aber immer noch kein Glück zu übersteuern.
Hier ist meine Klasse 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;
}
}
Ich habe es in meinem registriert 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>