'Save the PhpStorm Metadata file to Drupal root.', 'core' => array('8+'), 'aliases' => array('phpm'), 'category' => 'devel', ); return $items; } /** * Implements hook_drush_help_alter(). */ function phpstorm_drush_help_alter(&$command) { if ($command['command'] == 'cache-rebuild') { $command['options']['storm'] = 'Write a new PHPstorm metadata file to Drupal root.'; } } /* * Implements drush_hook_post_COMMAND(). */ function drush_phpstorm_post_cache_rebuild() { if (drush_get_option('storm')) { drush_invoke_process('@self', 'phpstorm-metadata'); } } /** * Generate PhpStorm Metadata file. * * @see http://confluence.jetbrains.com/display/PhpStorm/PhpStorm+Advanced+Metadata */ function drush_phpstorm_metadata() { $container = \Drupal::getContainer(); $reflectedClass = new ReflectionClass($container); $map = array(); // Map for all services of the container. // @see \Symfony\Component\DependencyInjection\Container::getServiceIds(). foreach ($reflectedClass->getMethods() as $method) { if (preg_match('/^get(.+)Service$/', $method->name, $match)) { $id = strtolower(preg_replace(array('/([A-Z]+)([A-Z][a-z])/', '/([a-z\d])([A-Z])/'), array('\\1_\\2', '\\1_\\2'), strtr($match[1], '_', '.'))); $service = \Drupal::service($id); if (is_object($service)) { $map["\\Drupal::service('')"][$id] = '\\' . get_class($service); } } } // Entity Manager - getStorage foreach (\Drupal::entityTypeManager()->getDefinitions() as $type => $definition) { $class = Drupal::entityTypeManager()->getStorage($type); $map["\\Drupal::entityManager()->getStorage('')"][$type] = '\\' . get_class($class); $map["\\Drupal::entityTypeManager()->getStorage('')"][$type] = '\\' . get_class($class); } $content = _drush_phpstorm_metadata_phpstorm_metadata_template($map); file_put_contents(DRUPAL_ROOT . '/.phpstorm.meta.php', $content); } function _drush_phpstorm_metadata_phpstorm_metadata_template($data) { $file = ' $map) { $file .= "\n"; $file .= " {$method} => [\n"; foreach ($map as $argument => $class) { $file .= " '{$argument}' instanceof {$class},\n"; } $file .= " ],"; $file .= "\n"; } $file .= ' ]; } '; return $file; }