/** * {@inheritDoc} * @throws RuntimeException */ public function buildResponse(DomainPayloadInterface $domainPayload, ResponseInterface $response) { try { $response->getBody()->rewind(); $response->getBody()->write(json_encode($domainPayload->getValues())); $headers = array_merge($this->headers, ['Content-Type' => 'application/json']); foreach ($headers as $header => $value) { $response = $response->withHeader($header, $value); } return $response->withStatus(200); } catch (Exception $e) { throw new RuntimeException('Response object could not be instantiated! ' . $e->getMessage()); } }
/** * {@inheritDoc} */ public function resolve(ServerRequestInterface $request, DomainPayloadInterface $domainPayload) { if (!$this->container->has($domainPayload->getType())) { $this->logger->error(sprintf('Could not find responder with id "%s"', $domainPayload->getType())); return null; } try { $responder = $this->container->get($domainPayload->getType()); if ($responder instanceof Responder) { return $responder; } else { $this->logger->debug(sprintf('Got "%s" but expected type "%s". Ignoring.', is_object($responder) ? get_class($responder) : $responder, Responder::class)); } } catch (Exception $e) { $this->logger->error(sprintf('An error occurred while trying to instantiate "%s": %s', $domainPayload->getType(), $e->getMessage())); } return null; }
/** * Tries to resolve an {@link \bitExpert\Adroit\Responder\Responder} instance by querying * the $responderResolvers. In case no matching action instance could be found an * exception gets thrown. * * @param ServerRequestInterface $request * @param DomainPayloadInterface $domainPayload * @return Responder * @throws RuntimeException */ protected function resolveResponder(ServerRequestInterface $request, DomainPayloadInterface $domainPayload) { $this->logger->debug(sprintf('Trying to resolve responder for domainpayload of type %s...', $domainPayload->getType())); foreach ($this->responderResolvers as $index => $resolver) { if (!$resolver instanceof ResponderResolver) { $this->logger->warning(sprintf('Action resolver at index %s is an instance of class %s which does not implement ' . '\\bitExpert\\Adroit\\Action\\Resolver\\ActionResolver. Skipped.', $index, get_class($resolver))); continue; } $responder = $resolver->resolve($request, $domainPayload); if ($responder instanceof Responder) { // step out of the loop when a responder could be found // by the resolver. First resolver wins! $this->logger->debug(sprintf('Resolved responder %s via resolver %s', get_class($responder), get_class($resolver))); return $responder; } } throw new RuntimeException(sprintf('A responder for domainpayload of type "%s" could not be found! Check your configuration!', $domainPayload->getType())); }