diff --git a/core/lib/Drupal/Core/Menu/Plugin/Derivative/StaticLocalActionDeriver.php b/core/lib/Drupal/Core/Menu/Plugin/Derivative/StaticLocalActionDeriver.php index 2547e27..996dd5f 100644 --- a/core/lib/Drupal/Core/Menu/Plugin/Derivative/StaticLocalActionDeriver.php +++ b/core/lib/Drupal/Core/Menu/Plugin/Derivative/StaticLocalActionDeriver.php @@ -9,10 +9,13 @@ use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\Core\Plugin\Discovery\ContainerDerivativeInterface; +use Drupal\Component\Plugin\Exception\PluginException; use Drupal\Core\StringTranslation\TranslationManager; -use Symfony\Component\DependencyInjection\ContainerInterface; +use Drupal\Component\Utility\String; use Drupal\Component\Discovery\YamlDiscovery; +use Symfony\Component\DependencyInjection\ContainerInterface; + /** * Provides plugin derivatives for local actions provided in YAML files. */ @@ -89,11 +92,17 @@ public function getDerivativeDefinition($derivative_id, array $base_plugin_defin */ public function getDerivativeDefinitions(array $base_plugin_definition) { $yaml_discovery = new YamlDiscovery('local_actions', $this->moduleHandler->getModuleDirectories()); + $required_keys = array('title' => 1, 'route_name' => 1, 'appears_on' => 1); foreach ($yaml_discovery->findAll() as $module => $local_actions) { if (!empty($local_actions)) { foreach ($local_actions as $name => $info) { - $info += array('title' => '', 'provider' => $module); + if ($missing_keys = array_diff_key($required_keys, array_intersect_key($info, $required_keys))) { + throw new PluginException(String::format('Static local action @name is missing @keys', array('@name' => $name, '@keys' => implode(', ', array_keys($missing_keys))))); + } + $info += array('provider' => $module, 'appears_on' => array()); + // Make sure 'appears_on' is an array. + $info['appears_on'] = (array) $info['appears_on']; $info['title'] = $this->translationManager->translate($info['title']); $this->derivatives[$name] = $info + $base_plugin_definition; }