function Recipe::validateConfigActions

Same name and namespace in other branches
  1. 11.x core/lib/Drupal/Core/Recipe/Recipe.php \Drupal\Core\Recipe\Recipe::validateConfigActions()

Validates that the corresponding extension is enabled for a config action.

Parameters

mixed $value: The config action; not used.

\Symfony\Component\Validator\Context\ExecutionContextInterface $context: The validator execution context.

string $include_path: The recipe's include path.

1 call to Recipe::validateConfigActions()
Recipe::parse in core/lib/Drupal/Core/Recipe/Recipe.php
Parses and validates a recipe.yml file.

File

core/lib/Drupal/Core/Recipe/Recipe.php, line 259

Class

Recipe
@internal This API is experimental.

Namespace

Drupal\Core\Recipe

Code

private static function validateConfigActions(mixed $value, ExecutionContextInterface $context, string $include_path) : void {
  $config_name = str_replace([
    '[config][actions]',
    '[',
    ']',
  ], '', $context->getPropertyPath());
  [
    $config_provider,
  ] = explode('.', $config_name);
  if ($config_provider === 'core') {
    return;
  }
  $recipe_being_validated = $context->getRoot();
  assert(is_array($recipe_being_validated));
  $configurator = new RecipeConfigurator($recipe_being_validated['recipes'] ?? [], $include_path);
  /** @var \Drupal\Core\Extension\ModuleExtensionList $module_list */
  $module_list = \Drupal::service('extension.list.module');
  // The config provider must either be an already-installed module or theme,
  // or an extension being installed by this recipe or a recipe it depends on.
  $all_extensions = [
    array_keys($module_list->getAllInstalledInfo()),
    array_keys(\Drupal::service('extension.list.theme')->getAllInstalledInfo()),
    $recipe_being_validated['install'] ?? [],
    $configurator->listAllExtensions(),
  ];
  // Explicitly treat required modules as installed, even if Drupal isn't
  // installed yet, because we know they WILL be installed.
  foreach ($module_list->getAllAvailableInfo() as $name => $info) {
    if (!empty($info['required'])) {
      $all_extensions[] = $name;
    }
  }
  if (!in_array($config_provider, $all_extensions, TRUE)) {
    $context->addViolation('Config actions cannot be applied to %config_name because the %config_provider extension is not installed, and is not installed by this recipe or any of the recipes it depends on.', [
      '%config_name' => $config_name,
      '%config_provider' => $config_provider,
    ]);
  }
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.