headless_cms-1.0.3/modules/headless_cms_preview/src/Routing/Routes.php
modules/headless_cms_preview/src/Routing/Routes.php
<?php
declare(strict_types=1);
namespace Drupal\headless_cms_preview\Routing;
use Drupal\Core\Routing\RouteObjectInterface;
use Drupal\headless_cms_preview\ParamConverter\HeadlessNodePreviewConverter;
use Drupal\jsonapi\ParamConverter\ResourceTypeConverter;
use Drupal\jsonapi\Routing\Routes as JsonApiRoutes;
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;
/**
* Defines dynamic routes for node previews.
*/
class Routes extends JsonApiRoutes {
/**
* {@inheritdoc}
*/
// phpcs:ignore
public function routes() {
$routes = new RouteCollection();
foreach ($this->resourceTypeRepository->all() as $resourceType) {
// Only handle `node` entities.
if ($resourceType->getEntityTypeId() === "node") {
$previewRoute = new Route(vsprintf("/%s/{node_preview}/preview", [
$resourceType->getPath(),
]));
$previewRoute
->setMethods(['GET'])
->setRequirement('_node_preview_access', '{node_preview}')
->addDefaults([
RouteObjectInterface::CONTROLLER_NAME => 'Drupal\headless_cms_preview\Controller\JsonApiEntityResource:getIndividualNodePreview',
self::RESOURCE_TYPE_KEY => $resourceType->getTypeName(),
])
->addOptions([
// Disable caching so anonymous users get the fresh preview data.
'no_cache' => TRUE,
'parameters' => [
'node_preview' => [
'type' => HeadlessNodePreviewConverter::TYPE_KEY,
],
],
]);
self::addRouteParameter(
route: $previewRoute,
name: self::RESOURCE_TYPE_KEY,
parameter: [
'type' => ResourceTypeConverter::PARAM_TYPE_ID,
]
);
$routes->add(self::getRouteName($resourceType, 'individual.preview'), $previewRoute);
}
}
// Resource routes all have the same base path.
$routes->addPrefix($this->jsonApiBasePath);
// Require the JSON:API media type header on every route.
$routes->addRequirements(['_content_type_format' => 'api_json']);
// Enable all available authentication providers.
$routes->addOptions(['_auth' => $this->providerIds]);
// Flag every route as belonging to the JSON:API module.
$routes->addDefaults([static::JSON_API_ROUTE_FLAG_KEY => TRUE]);
// All routes serve only the JSON:API media type.
// This is the only "required" requirement (forgive the redundancy) to make
// JSON:API return its own 404 error (in JSON format) instead of Drupal's
// default 404 HTML page.
$routes->addRequirements(['_format' => 'api_json']);
return $routes;
}
}
