headless_cms-1.0.3/modules/headless_cms_preview/src/ParamConverter/HeadlessNodePreviewConverter.php

modules/headless_cms_preview/src/ParamConverter/HeadlessNodePreviewConverter.php
<?php

declare(strict_types=1);

namespace Drupal\headless_cms_preview\ParamConverter;

use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\PageCache\ResponsePolicy\KillSwitch;
use Drupal\Core\ParamConverter\ParamConverterInterface;
use Drupal\headless_cms_preview\PreviewToken\PreviewTokenNegotiator;
use Drupal\headless_cms_preview\TempStore\PreviewTempStoreFactory;
use Psr\Log\LoggerInterface;
use Symfony\Component\DependencyInjection\Attribute\Autowire;
use Symfony\Component\Routing\Route;

/**
 * Provides upcasting for a node entity in preview.
 */
class HeadlessNodePreviewConverter implements ParamConverterInterface {

  public const TYPE_KEY = 'headless_node_preview';

  /**
   * Constructs a new NodePreviewConverter.
   */
  public function __construct(
    protected EntityTypeManagerInterface $entityTypeManager,
    protected PreviewTokenNegotiator $negotiator,
    protected PreviewTempStoreFactory $tempStoreFactory,
    protected KillSwitch $killSwitch,
    #[Autowire('@logger.channel.headless_cms_preview')]
    protected LoggerInterface $logger,
  ) {}

  /**
   * {@inheritdoc}
   */
  public function convert($value, $definition, $name, array $defaults) {
    $previewToken = $this->negotiator->negotiateFromRequest();
    if (!$previewToken) {
      // Prevent caching of failed request.
      $this->killSwitch->trigger();

      $this->logger->warning('Node preview parameter not converted: no preview token set in request');
      return NULL;
    }

    // Check the preview token matches the acutal uuid.
    if ($value !== $previewToken->entityUuid) {
      // Prevent caching of failed request.
      $this->killSwitch->trigger();

      $this->logger->warning('Node preview parameter not converted: uuid mismatch');
      return NULL;
    }

    /** @var \Drupal\user\UserInterface $owner */
    $owner = $this->entityTypeManager->getStorage('user')->load($previewToken->ownerUid);
    if (!$owner) {
      // Prevent caching of failed request.
      $this->killSwitch->trigger();

      $this->logger->warning('Node preview parameter not converted: no user could be loaded for uid @uid', [
        '@uid' => $previewToken->ownerUid,
      ]);
      return NULL;
    }

    $store = $this->tempStoreFactory->get('node_preview', $owner);
    if ($form_state = $store->get($value)) {
      return $form_state->getFormObject()->getEntity();
    }
  }

  /**
   * {@inheritdoc}
   */
  public function applies($definition, $name, Route $route) {
    if (!empty($definition['type']) && $definition['type'] == 'headless_node_preview') {
      return TRUE;
    }
    return FALSE;
  }

}

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

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