jsonapi.services.yml | 1 + src/Controller/EntityResource.php | 26 ++++++++++++++++++-------- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/jsonapi.services.yml b/jsonapi.services.yml index 841b72c..7336d72 100644 --- a/jsonapi.services.yml +++ b/jsonapi.services.yml @@ -161,6 +161,7 @@ services: - '@jsonapi.link_manager' - '@jsonapi.resource_type.repository' - '@renderer' + - '@request_stack' # Event subscribers. jsonapi.custom_query_parameter_names_validator.subscriber: diff --git a/src/Controller/EntityResource.php b/src/Controller/EntityResource.php index 189e9a6..a5798a8 100644 --- a/src/Controller/EntityResource.php +++ b/src/Controller/EntityResource.php @@ -4,6 +4,7 @@ namespace Drupal\jsonapi\Controller; use Drupal\Component\Serialization\Json; use Drupal\Core\Cache\CacheableMetadata; +use Drupal\Core\Cache\Context\RequestStackCacheContextBase; use Drupal\Core\Config\Entity\ConfigEntityInterface; use Drupal\Core\Entity\ContentEntityInterface; use Drupal\Core\Entity\EntityFieldManagerInterface; @@ -29,6 +30,7 @@ use Drupal\jsonapi\ResourceResponse; use Drupal\jsonapi\ResourceType\ResourceType; use Drupal\jsonapi\ResourceType\ResourceTypeRepositoryInterface; use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; use Symfony\Component\HttpKernel\Exception\ConflictHttpException; @@ -84,6 +86,13 @@ class EntityResource { protected $renderer; /** + * The request stack. + * + * @var \Symfony\Component\HttpFoundation\RequestStack + */ + protected $requestStack; + + /** * Instantiates a EntityResource object. * * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager @@ -98,14 +107,17 @@ class EntityResource { * The link manager service. * @param \Drupal\Core\Render\RendererInterface $renderer * The renderer. + * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack + * The request stack. */ - public function __construct(EntityTypeManagerInterface $entity_type_manager, EntityFieldManagerInterface $field_manager, FieldTypePluginManagerInterface $plugin_manager, LinkManager $link_manager, ResourceTypeRepositoryInterface $resource_type_repository, RendererInterface $renderer) { + public function __construct(EntityTypeManagerInterface $entity_type_manager, EntityFieldManagerInterface $field_manager, FieldTypePluginManagerInterface $plugin_manager, LinkManager $link_manager, ResourceTypeRepositoryInterface $resource_type_repository, RendererInterface $renderer, RequestStack $request_stack) { $this->entityTypeManager = $entity_type_manager; $this->fieldManager = $field_manager; $this->pluginManager = $plugin_manager; $this->linkManager = $link_manager; $this->resourceTypeRepository = $resource_type_repository; $this->renderer = $renderer; + $this->requestStack = $request_stack; } /** @@ -801,7 +813,7 @@ class EntityResource { * The response. */ protected function buildWrappedResponse($data, $response_code = 200, array $headers = [], array $links = [], array $meta = []) { - $links['self'] = $this->linkManager->getRequestLink(\Drupal::request()); + $links['self'] = $this->linkManager->getRequestLink($this->requestStack->getCurrentRequest()); return new ResourceResponse(new JsonApiDocumentTopLevel($data, $links, $meta), $response_code, $headers); } @@ -819,13 +831,11 @@ class EntityResource { protected function respondWithCollection(EntityCollection $entity_collection, ResourceType $resource_type) { $link_context = [ 'has_next_page' => $entity_collection->hasNextPage(), - 'total_count' => $resource_type->includeCount() - ? $entity_collection->getTotalCount() - : FALSE, ]; - $meta = $link_context['total_count'] === FALSE - ? [] - : ['count' => $link_context['total_count']]; + $meta = []; + if ($resource_type->includeCount()) { + $link_context['total_count'] = $meta['count'] = $entity_collection->getTotalCount(); + } $collection_links = $this->linkManager->getPagerLinks(\Drupal::request(), $link_context); $response = $this->buildWrappedResponse($entity_collection, 200, [], $collection_links, $meta);