farm-2.x-dev/modules/core/api/src/Controller/FarmEntryPoint.php
modules/core/api/src/Controller/FarmEntryPoint.php
<?php
namespace Drupal\farm_api\Controller;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Extension\ProfileExtensionList;
use Drupal\Core\Session\AccountInterface;
use Drupal\jsonapi\CacheableResourceResponse;
use Drupal\jsonapi\Controller\EntryPoint;
use Drupal\jsonapi\JsonApiResource\JsonApiDocumentTopLevel;
use Drupal\jsonapi\JsonApiResource\NullIncludedData;
use Drupal\jsonapi\JsonApiResource\ResourceObjectData;
use Drupal\jsonapi\ResourceType\ResourceTypeRepositoryInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Extend the core jsonapi EntryPoint controller.
*
* Adds a "meta.farm" key to root /api endpoint.
*
* @ingroup farm
*
* @phpstan-ignore-next-line
*/
class FarmEntryPoint extends EntryPoint {
/**
* Farm profile info.
*
* @var mixed[]
*/
protected $farmProfileInfo;
/**
* The module handler.
*
* @var \Drupal\Core\Extension\ModuleHandlerInterface
*/
protected $moduleHandler;
/**
* EntryPoint constructor.
*
* @param \Drupal\jsonapi\ResourceType\ResourceTypeRepositoryInterface $resource_type_repository
* The resource type repository.
* @param \Drupal\Core\Session\AccountInterface $user
* The current user.
* @param \Drupal\Core\Extension\ProfileExtensionList $profile_extension_list
* The profile extension list service.
* @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
* The module handler.
*/
public function __construct(ResourceTypeRepositoryInterface $resource_type_repository, AccountInterface $user, ProfileExtensionList $profile_extension_list, ModuleHandlerInterface $module_handler) {
parent::__construct($resource_type_repository, $user);
$this->farmProfileInfo = $profile_extension_list->getExtensionInfo('farm');
$this->moduleHandler = $module_handler;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('jsonapi.resource_type.repository'),
$container->get('current_user'),
$container->get('extension.list.profile'),
$container->get('module_handler'),
);
}
/**
* {@inheritdoc}
*/
public function index() {
// Get the base url.
global $base_url;
// Get normal response cache and data.
/** @var \Drupal\jsonapi\CacheableResourceResponse $response */
$response = parent::index();
$cacheability = $response->getCacheableMetadata();
$data = $response->getResponseData();
// Get urls and meta.
$urls = $data->getLinks();
$meta = $data->getMeta();
// Add a "farm" object to meta.
$meta['farm'] = [
'name' => $this->config('system.site')->get('name'),
'url' => $base_url,
'version' => $this->farmProfileInfo['version'],
];
// Allow modules to add additional meta information.
$this->moduleHandler->alter('farm_api_meta', $meta['farm']);
// Build a new response.
$new_response = new CacheableResourceResponse(new JsonApiDocumentTopLevel(new ResourceObjectData([]), new NullIncludedData(), $urls, $meta));
// Add the original response's cacheability.
$new_response->addCacheableDependency($cacheability);
return $new_response;
}
}
