/** * Register a resource definition for this endpoint. * * @throws LogicException when a resource name was already used. * @param ResourceDefinitionInterface $resource */ public function addResourceDefinition(ResourceDefinitionInterface $resource) { if (array_key_exists($resource->getName(), $this->resources)) { throw new LogicException(sprintf('Cannot register a resource named `%s` twice.', $resource->getName())); } $this->resources[$resource->getName()] = $resource; }
/** * @param ResponseInterface $response * @param ResourceDefinitionInterface $resource * @return array */ public function process(ResponseInterface $response, ResourceDefinitionInterface $resource) { if (!$response instanceof ApiResponse) { throw new \InvalidArgumentException(sprintf('Expected an ApiResponse, got %s', get_class($response))); } $dataClass = $resource->getReturnType(); if (!$dataClass) { throw new RuntimeException(sprintf('Return type is not defined for resource `%s` (%s), cannot hydrate', $resource->getName(), $resource->getPath())); } if (!class_exists($dataClass)) { throw new RuntimeException(sprintf('Cannot hydrate an instance of class `%s` as the class does not exist', $dataClass)); } $reflection = new \ReflectionClass($dataClass); $this->reflObject = new \ReflectionObject($reflection->newInstance()); if ($resource->getMethod() === ResourceDefinitionInterface::METHOD_CGET) { $result = []; foreach ($response->getData() as $row) { $result[] = $this->hydrateRow($reflection->newInstance(), $row); } } else { $result = $this->hydrateRow($reflection->newInstance(), $response->getData()); } return $result; }