From 7279f2096e8f6a5fcefb184624242a0225c2f748 Mon Sep 17 00:00:00 2001 From: Kacper Donat Date: Sat, 21 Mar 2020 15:41:49 +0100 Subject: [PATCH] Fix bug with non serializing recursive departure --- config/packages/jms_serializer.yaml | 4 ++++ resources/ts/components/picker.ts | 2 +- .../WithDestinationsDatabaseHandler.php | 6 ++++++ src/Service/AggregateConverter.php | 21 ++++++++++++++++++- src/Service/SerializerContextFactory.php | 2 +- 5 files changed, 32 insertions(+), 3 deletions(-) diff --git a/config/packages/jms_serializer.yaml b/config/packages/jms_serializer.yaml index d25fa03..d83e1d3 100644 --- a/config/packages/jms_serializer.yaml +++ b/config/packages/jms_serializer.yaml @@ -1,4 +1,8 @@ jms_serializer: + default_context: + serialization: + serialize_null: true + visitors: xml_serialization: format_output: '%kernel.debug%' diff --git a/resources/ts/components/picker.ts b/resources/ts/components/picker.ts index 93493d1..4dbac37 100644 --- a/resources/ts/components/picker.ts +++ b/resources/ts/components/picker.ts @@ -42,7 +42,7 @@ export class PickerStopComponent extends Vue { [lines => lines.length > 2, ([first]) => `${first.symbol}…`], ); - return unique(this.stop.destinations || [], destination => destination.stop.name).map(compactLines); + return unique(this.stop.destinations || [], destination => destination.stop && destination.stop.name).map(compactLines); } } diff --git a/src/Handler/Database/WithDestinationsDatabaseHandler.php b/src/Handler/Database/WithDestinationsDatabaseHandler.php index f3f7879..eeb1dfb 100644 --- a/src/Handler/Database/WithDestinationsDatabaseHandler.php +++ b/src/Handler/Database/WithDestinationsDatabaseHandler.php @@ -7,6 +7,7 @@ use App\Event\PostProcessEvent; use App\Handler\PostProcessingHandler; use App\Model\Destination; use App\Model\Stop; +use App\Service\CacheableConverter; use App\Service\Converter; use App\Service\IdUtils; use Doctrine\ORM\EntityManagerInterface; @@ -25,6 +26,11 @@ class WithDestinationsDatabaseHandler implements PostProcessingHandler $this->em = $entityManager; $this->converter = $converter; $this->id = $id; + + if ($this->converter instanceof CacheableConverter) { + $this->converter = clone $this->converter; + $this->converter->flushCache(); + } } public function postProcess(PostProcessEvent $event) diff --git a/src/Service/AggregateConverter.php b/src/Service/AggregateConverter.php index ef180c7..e9087d1 100644 --- a/src/Service/AggregateConverter.php +++ b/src/Service/AggregateConverter.php @@ -3,8 +3,9 @@ namespace App\Service; use Tightenco\Collect\Support\Collection; +use function Kadet\Functional\Predicates\instance; -class AggregateConverter implements Converter +class AggregateConverter implements Converter, CacheableConverter { private $converters; @@ -42,4 +43,22 @@ class AggregateConverter implements Converter { return clone $this->converters; } + + public function flushCache() + { + $this + ->converters + ->filter(instance(CacheableConverter::class)) + ->each(function (CacheableConverter $converter) { + $converter->flushCache(); + }) + ; + } + + public function __clone() + { + $this->converters = $this->converters->map(function ($object) { + return clone $object; + }); + } } diff --git a/src/Service/SerializerContextFactory.php b/src/Service/SerializerContextFactory.php index 94156b9..310235f 100644 --- a/src/Service/SerializerContextFactory.php +++ b/src/Service/SerializerContextFactory.php @@ -23,7 +23,7 @@ final class SerializerContextFactory public function create($subject, array $groups = ['Default']) { - return SerializationContext::create()->setGroups($this->groups($subject, $groups)); + return SerializationContext::create()->setSerializeNull(true)->setGroups($this->groups($subject, $groups)); } private function groups($subject, array $groups)