View source
<?php
namespace Drupal\jsonapi_extras\ResourceType;
use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Entity\EntityRepositoryInterface;
use Drupal\jsonapi\ResourceType\ResourceTypeRepository;
use Drupal\jsonapi_extras\Plugin\ResourceFieldEnhancerManager;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Entity\EntityFieldManagerInterface;
class ConfigurableResourceTypeRepository extends ResourceTypeRepository {
protected $entityRepository;
protected $enhancerManager;
protected $bundleManager;
protected $configFactory;
protected $resourceTypes;
protected $enabledResourceTypes;
protected $resourceConfigs;
public function __construct(EntityTypeManagerInterface $entity_type_manager, EntityTypeBundleInfoInterface $bundle_manager, EntityFieldManagerInterface $entity_field_manager, EntityRepositoryInterface $entity_repository, ResourceFieldEnhancerManager $enhancer_manager, ConfigFactoryInterface $config_factory) {
parent::__construct($entity_type_manager, $bundle_manager, $entity_field_manager);
$this->entityRepository = $entity_repository;
$this->enhancerManager = $enhancer_manager;
$this->configFactory = $config_factory;
$this->entityFieldManager = $entity_field_manager;
$this->bundleManager = $bundle_manager;
}
public function all() {
if (!$this->all) {
foreach ($this
->getEntityTypeBundleTuples() as $tuple) {
list($entity_type_id, $bundle) = $tuple;
$resource_config_id = sprintf('%s--%s', $entity_type_id, $bundle);
$this->all[] = new ConfigurableResourceType($entity_type_id, $bundle, $this->entityTypeManager
->getDefinition($entity_type_id)
->getClass(), $this
->getResourceConfig($resource_config_id), $this->enhancerManager, $this->configFactory);
}
foreach ($this->all as $resource_type) {
$relatable_resource_types = $this
->calculateRelatableResourceTypes($resource_type);
$resource_type
->setRelatableResourceTypes($relatable_resource_types);
}
}
return $this->all;
}
protected function getResourceConfig($resource_config_id) {
$resource_configs = $this
->getResourceConfigs();
return isset($resource_configs[$resource_config_id]) ? $resource_configs[$resource_config_id] : new NullJsonapiResourceConfig([], '');
}
function getResourceConfigs() {
if (!$this->resourceConfigs) {
$resource_config_ids = [];
foreach ($this
->getEntityTypeBundleTuples() as $tuple) {
list($entity_type_id, $bundle) = $tuple;
$resource_config_ids[] = sprintf('%s--%s', $entity_type_id, $bundle);
}
$this->resourceConfigs = $this->entityTypeManager
->getStorage('jsonapi_resource_config')
->loadMultiple($resource_config_ids);
}
return $this->resourceConfigs;
}
protected function getEntityTypeBundleTuples() {
$entity_type_ids = array_keys($this->entityTypeManager
->getDefinitions());
return array_reduce($entity_type_ids, function ($carry, $entity_type_id) {
$bundles = array_keys($this->bundleManager
->getBundleInfo($entity_type_id));
$tuples = array_map(function ($bundle) use ($entity_type_id) {
return [
$entity_type_id,
$bundle,
];
}, $bundles);
return array_merge($carry, $tuples);
}, []);
}
public function getPathPrefix() {
return $this->configFactory
->get('jsonapi_extras.settings')
->get('path_prefix');
}
}