1

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> 

Antwort

0

Dies geschieht, weil JMSSerializerBundle nach meinem Bündel in AppKernel registriert wurde, die dass das, was bedeutete, Service, den ich define wird von der JMS Serializer-Version überschrieben.

Lösung: setzen Sie Ihr Bündel zuunterst in AppKernel.php wie so:

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

    return $bundles; 
}