diff --git a/core/core.services.yml b/core/core.services.yml index 3f68677200..0bbc0b7dc6 100644 --- a/core/core.services.yml +++ b/core/core.services.yml @@ -972,6 +972,11 @@ services: tags: - { name: paramconverter } arguments: ['@entity.manager', '@language_manager'] + paramconverter.simple_config: + class: Drupal\Core\ParamConverter\SimpleConfigConverter + tags: + - { name: paramconverter } + arguments: ['@config.factory'] paramconverter.entity_revision: class: Drupal\Core\ParamConverter\EntityRevisionParamConverter tags: diff --git a/core/lib/Drupal/Core/ParamConverter/SimpleConfigConverter.php b/core/lib/Drupal/Core/ParamConverter/SimpleConfigConverter.php new file mode 100644 index 0000000000..46ad05881b --- /dev/null +++ b/core/lib/Drupal/Core/ParamConverter/SimpleConfigConverter.php @@ -0,0 +1,40 @@ +configFactory = $configFactory; + } + + /** + * {@inheritdoc} + */ + public function convert($value, $definition, $name, array $defaults) { + return $this->configFactory->get($definition['simple_config']); + } + + /** + * {@inheritdoc} + */ + public function applies($definition, $name, Route $route) { + return !empty($definition['simple_config']); + } + +} diff --git a/core/modules/rest/src/Plugin/Deriver/SimpleConfigDeriver.php b/core/modules/rest/src/Plugin/Deriver/SimpleConfigDeriver.php index 93892965c4..00e6e71f4b 100644 --- a/core/modules/rest/src/Plugin/Deriver/SimpleConfigDeriver.php +++ b/core/modules/rest/src/Plugin/Deriver/SimpleConfigDeriver.php @@ -69,17 +69,21 @@ public function getDerivativeDefinitions($base_plugin_definition) { }); foreach ($simple_config_schemas as $name => $simple_config_schema) { - $this->derivatives[$name] = [ - 'id' => 'config:' . $name, + $this->derivatives[str_replace('.', '_', $name)] = [ + 'id' => 'config_' . str_replace('.', '_', $name), 'config_name' => $name, 'serialization_class' => '@fixme', 'label' => isset($simple_config_schema['label']) ? $simple_config_schema['label'] : 'Config: ' . $name, - ]; + ] + $base_plugin_definition; } + return $this->derivatives; } protected function isConfigSchema(array $schema, array $all_schemas) { + if (empty($schema['type'])) { + return FALSE; + } if ($schema['type'] === 'config_object') { return TRUE; } diff --git a/core/modules/rest/src/Plugin/Type/ResourcePluginManager.php b/core/modules/rest/src/Plugin/Type/ResourcePluginManager.php index 4dd9ca2d4e..a51120e6e0 100644 --- a/core/modules/rest/src/Plugin/Type/ResourcePluginManager.php +++ b/core/modules/rest/src/Plugin/Type/ResourcePluginManager.php @@ -30,7 +30,7 @@ class ResourcePluginManager extends DefaultPluginManager { public function __construct(\Traversable $namespaces, CacheBackendInterface $cache_backend, ModuleHandlerInterface $module_handler) { parent::__construct('Plugin/rest/resource', $namespaces, $module_handler, 'Drupal\rest\Plugin\ResourceInterface', 'Drupal\rest\Annotation\RestResource'); - $this->setCacheBackend($cache_backend, 'rest_plugins'); +// $this->setCacheBackend($cache_backend, 'rest_plugins'); $this->alterInfo('rest_resource'); } diff --git a/core/modules/rest/src/Plugin/rest/resource/SimpleConfigResource.php b/core/modules/rest/src/Plugin/rest/resource/SimpleConfigResource.php index 1bac4f2627..ef4cabbfda 100644 --- a/core/modules/rest/src/Plugin/rest/resource/SimpleConfigResource.php +++ b/core/modules/rest/src/Plugin/rest/resource/SimpleConfigResource.php @@ -68,7 +68,6 @@ class SimpleConfigResource extends ResourceBase implements DependentPluginInterf */ public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityTypeManagerInterface $entity_type_manager, $serializer_formats, LoggerInterface $logger, ConfigFactoryInterface $config_factory, PluginManagerInterface $link_relation_type_manager) { parent::__construct($configuration, $plugin_id, $plugin_definition, $serializer_formats, $logger); - $this->entityType = $entity_type_manager->getDefinition($plugin_definition['entity_type']); $this->configFactory = $config_factory; $this->linkRelationTypeManager = $link_relation_type_manager; } @@ -105,47 +104,6 @@ public function get(StorableConfigBase $config) { return $response; } - /** - * Responds toconfig PATCH requests. - * - * @param \Drupal\Core\Config\StorableConfigBase $original_config - * The original config object. - * @param \Drupal\Core\Config\StorableConfigBase $config - * The config. - * - * @return \Drupal\rest\ModifiedResourceResponse - * The HTTP response object. - * - * @throws \Symfony\Component\HttpKernel\Exception\HttpException - */ - public function patch(StorableConfigBase $original_config, StorableConfigBase $config = NULL) { - if ($config == NULL) { - throw new BadRequestHttpException('No config received.'); - } - $definition = $this->getPluginDefinition(); - if ($config->getName() !== $definition['config_name']) { - throw new BadRequestHttpException('Invalid config'); - } - // @fixme access checking? - - // Overwrite the received fields. -// foreach ($entity->_restSubmittedFields as $field_name) { -// } - - // @fixme validation? - - try { - $config->save(TRUE); - $this->logger->notice('Updated config %name', ['%name' => $config->getName()]); - - // Return the updated entity in the response body. - return new ModifiedResourceResponse($config, 200); - } - catch (StorageException $e) { - throw new HttpException(500, 'Internal Server Error', $e); - } - } - /** * {@inheritdoc} */ @@ -168,7 +126,7 @@ protected function getBaseRoute($canonical_path, $method) { $parameters = $route->getOption('parameters') ?: []; // @todo Add a config param converter? - $parameters[$definition['config_name']]['type'] = 'config:' . $definition['config_name']; + $parameters['simple_config']['simple_config'] = $definition['config_name']; $route->setOption('parameters', $parameters); return $route; @@ -178,10 +136,14 @@ protected function getBaseRoute($canonical_path, $method) { * {@inheritdoc} */ public function availableMethods() { - $methods = parent::availableMethods(); - $unsupported_methods = ['POST', 'PUT', 'DELETE']; - $methods = array_diff($methods, $unsupported_methods); - return $methods; + return ['GET']; + } + + /** + * {@inheritdoc} + */ + public function calculateDependencies() { + return []; } } diff --git a/core/modules/serialization/serialization.services.yml b/core/modules/serialization/serialization.services.yml index dca6094787..0d7f6464d8 100644 --- a/core/modules/serialization/serialization.services.yml +++ b/core/modules/serialization/serialization.services.yml @@ -7,6 +7,11 @@ services: tags: - { name: normalizer } arguments: ['@entity.manager'] + serializer.normalizer.simple_config: + class: Drupal\serialization\Normalizer\SimpleConfigNormalizer + tags: + - { name: normalizer } + arguments: ['@entity.manager'] serializer.normalizer.content_entity: class: Drupal\serialization\Normalizer\ContentEntityNormalizer tags: diff --git a/core/modules/serialization/src/Normalizer/SimpleConfigNormalizer.php b/core/modules/serialization/src/Normalizer/SimpleConfigNormalizer.php new file mode 100644 index 0000000000..b047174b46 --- /dev/null +++ b/core/modules/serialization/src/Normalizer/SimpleConfigNormalizer.php @@ -0,0 +1,25 @@ +get(); + } + +}