headless_cms-1.0.3/modules/headless_cms_preview/src/Controller/JsonApiEntityResource.php

modules/headless_cms_preview/src/Controller/JsonApiEntityResource.php
<?php

declare(strict_types=1);

namespace Drupal\headless_cms_preview\Controller;

use Drupal\Core\Cache\CacheableResponseInterface;
use Drupal\headless_cms_preview\JsonApi\PreviewIncludeResolver;
use Drupal\jsonapi\Controller\EntityResource as BaseEntityResource;
use Drupal\jsonapi\Exception\EntityAccessDeniedHttpException;
use Drupal\jsonapi\IncludeResolver;
use Drupal\jsonapi\JsonApiResource\NullIncludedData;
use Drupal\jsonapi\JsonApiResource\ResourceObject;
use Drupal\jsonapi\JsonApiResource\ResourceObjectData;
use Drupal\jsonapi\ResourceResponse;
use Drupal\node\NodeInterface;
use Symfony\Component\HttpFoundation\Request;

/**
 * Process node preview requests.
 */
class JsonApiEntityResource extends BaseEntityResource {

  /**
   * The preview include resolver.
   */
  protected ?PreviewIncludeResolver $previewIncludeResolver = NULL;

  /**
   * Set the preview include resolver.
   */
  public function setPreviewIncludeResolver(PreviewIncludeResolver $previewIncludeResolver) {
    $this->previewIncludeResolver = $previewIncludeResolver;
  }

  /**
   * Gets the preview of a node.
   *
   * @param \Drupal\node\NodeInterface $node_preview
   *   The node being previewed.
   * @param \Symfony\Component\HttpFoundation\Request $request
   *   The request object.
   *
   * @return \Drupal\jsonapi\ResourceResponse
   *   The response.
   *
   * @throws \Drupal\jsonapi\Exception\EntityAccessDeniedHttpException
   *   Thrown when access to the entity is not allowed.
   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
   * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
   */
  public function getIndividualNodePreview(NodeInterface $node_preview, Request $request): ResourceResponse {
    // Avoid caching previews at all.
    $node_preview->mergeCacheMaxAge(0);

    // Check access.
    $resourceObject = $this->entityAccessChecker->getAccessCheckedResourceObject($node_preview);
    if ($resourceObject instanceof EntityAccessDeniedHttpException) {
      throw $resourceObject;
    }

    $primaryData = new ResourceObjectData([$resourceObject], 1);
    // Get includes in preview mode.
    $response = $this->buildWrappedResponse($primaryData, $request, $this->getPreviewIncludes($request, $primaryData));

    // Copy the cachability from the data to the response.
    if ($response instanceof CacheableResponseInterface) {
      $response->addCacheableDependency($primaryData);
    }

    return $response;
  }

  /**
   * Gets the preview of a node.
   */
  public function getPreviewIncludes(Request $request, mixed $data) {
    assert($data instanceof ResourceObject || $data instanceof ResourceObjectData);
    assert($this->includeResolver instanceof IncludeResolver);

    if ($request->query->has('include') && ($include_parameter = $request->query->get('include')) && !empty($include_parameter)) {
      return $this->previewIncludeResolver->resolve($data, $include_parameter);
    }

    return new NullIncludedData();
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc