/** * Build a configured Hateoas instance. * * @return Hateoas */ public function build() { $metadataFactory = $this->buildMetadataFactory(); $relationProvider = new RelationProvider($metadataFactory, $this->chainResolver); $relationsRepository = new RelationsRepository($metadataFactory, $relationProvider); $expressionEvaluator = new ExpressionEvaluator($this->getExpressionLanguage()); $linkFactory = new LinkFactory($expressionEvaluator, $this->urlGeneratorRegistry); $exclusionManager = new ExclusionManager($expressionEvaluator); $linksFactory = new LinksFactory($relationsRepository, $linkFactory, $exclusionManager); $embeddedMapFactory = new EmbedsFactory($relationsRepository, $expressionEvaluator, $exclusionManager); $linkHelper = new LinkHelper($linkFactory, $relationsRepository); // Register Hateoas core functions $expressionEvaluator->registerFunction(new LinkExpressionFunction($linkHelper)); if (null === $this->xmlSerializer) { $this->setDefaultXmlSerializer(); } if (null === $this->jsonSerializer) { $this->setDefaultJsonSerializer(); } $inlineDeferrers = array(); $eventSubscribers = array(new XmlEventSubscriber($this->xmlSerializer, $linksFactory, $embeddedMapFactory), new JsonEventSubscriber($this->jsonSerializer, $linksFactory, $embeddedMapFactory, $inlineDeferrers[] = new InlineDeferrer(), $inlineDeferrers[] = new InlineDeferrer())); $this->serializerBuilder->addDefaultListeners()->configureListeners(function (EventDispatcherInterface $dispatcher) use($eventSubscribers) { foreach ($eventSubscribers as $eventSubscriber) { $dispatcher->addSubscriber($eventSubscriber); } }); $jmsSerializer = $this->serializerBuilder->build(); foreach (array_merge($inlineDeferrers, array($this->jsonSerializer, $this->xmlSerializer)) as $serializer) { if ($serializer instanceof JMSSerializerMetadataAwareInterface) { $serializer->setMetadataFactory($jmsSerializer->getMetadataFactory()); } } return new Hateoas($jmsSerializer, $linkHelper); }