content_packager-8.x-1.x-dev/src/JsonApiHelper.php
src/JsonApiHelper.php
<?php namespace Drupal\content_packager; use Drupal\Component\Serialization\Json; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\HttpKernelInterface; /** * A helper that assists with processing multi-page JSON:API responses. * * @package content_packager */ class JsonApiHelper { /** * Helper function that returns data from all of the pages for a JSON:API uri. * * TODO: Add some caching here, this gets called at least twice on each * uri and all these extra requests and Json::decode() probably add up. * * @param string $uri * JSON:API endpoint/request. * * @return array * An array of individual parsed JSON:API results converted into PHP data. */ public static function retrievePagesFromUri($uri) { /** @var \Symfony\Component\HttpKernel\HttpKernel $http_kernel */ $http_kernel = \Drupal::service('http_kernel.basic'); /** @var \Symfony\Component\HttpFoundation\RequestStack $request_stack */ $request_stack = \Drupal::service('request_stack'); $content = []; $next_page = $uri; while ($next_page) { $jsonApiRequest = Request::create($next_page, 'GET'); $jsonApiRequest->setSession($request_stack->getCurrentRequest()->getSession()); try { $subResponse = $http_kernel->handle($jsonApiRequest, HttpKernelInterface::SUB_REQUEST, FALSE); $response = $subResponse->getContent(); $content[] = $response; } catch (\Exception $e) { // This will prevent ANY content from being packaged, but this seems // fine... there doesn't seem to be much value in a partial export. return NULL; } /* TODO: Find a quicker/more efficient approach than this; Json::decode() is getting called multiple times throughout this module. */ $decoded = Json::decode($response); $next_page = empty($decoded['links']['next']) ? FALSE : $decoded['links']['next']['href']; } return $content; } }