/** * @param ResourceDefinitionInterface $resourceDefinition * @param array $parameters * @return string * @throws \Exception */ public function generate(ResourceDefinitionInterface $resourceDefinition, array $parameters = array()) { $definedParams = $resourceDefinition->getParameters(); if (count($definedParams) < count($parameters)) { throw new \RuntimeException(); } preg_match('/\\{([a-zA-Z.]+)\\}+/', $resourceDefinition->getPath(), $paramsInPath); $path = preg_replace_callback('/\\{([a-zA-Z.]+)\\}+/', function ($matches) use($parameters, $resourceDefinition, $paramsInPath) { if (strpos($matches[1], '.')) { $accessor = PropertyAccess::createPropertyAccessor(); $path = explode('.', $matches[1]); $root = array_shift($path); $result = $accessor->getValue($parameters[$root], implode('.', $path)); $paramsInPath[] = $root; } else { if (!array_key_exists($matches[1], $parameters)) { throw new \RuntimeException(sprintf('Parameter `%s` is required in route `%s`, but was not passed', $matches[1], $resourceDefinition->getPath())); } $result = $parameters[$matches[1]]; $paramsInPath[] = $matches[1]; } return $result; }, $resourceDefinition->getPath()); $leftovers = array_diff_key($definedParams, array_flip($paramsInPath)); $leftoverValues = array_intersect_key($parameters, $leftovers); if ($leftoverValues) { $path .= '?' . http_build_query($leftoverValues); } return $path; }
/** * @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; }