--- /dev/null
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Console\Command\PluginDebugCommand.
+ */
+
+namespace Drupal\Console\Command;
+
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Yaml\Yaml;
+use Drupal\Console\Core\Command\Shared\ContainerAwareCommandTrait;
+use Drupal\Console\Core\Style\DrupalStyle;
+
+/**
+ * Class DebugCommand
+ *
+ * @package Drupal\Console\Command
+ */
+class PluginDebugCommand extends Command
+{
+ use ContainerAwareCommandTrait;
+ /**
+ * {@inheritdoc}
+ */
+ protected function configure()
+ {
+ $this->setName('plugin:debug')
+ ->setDescription($this->trans('commands.plugin.debug.description'))
+ ->setHelp($this->trans('commands.plugin.debug.help'))
+ ->addArgument(
+ 'type',
+ InputArgument::OPTIONAL,
+ $this->trans('commands.plugin.debug.arguments.type')
+ )
+ ->addArgument(
+ 'id',
+ InputArgument::OPTIONAL,
+ $this->trans('commands.plugin.debug.arguments.id')
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function execute(InputInterface $input, OutputInterface $output)
+ {
+ $io = new DrupalStyle($input, $output);
+
+ $pluginType = $input->getArgument('type');
+ $pluginId = $input->getArgument('id');
+
+ // No plugin type specified, show a list of plugin types.
+ if (!$pluginType) {
+ $tableHeader = [
+ $this->trans('commands.plugin.debug.table-headers.plugin-type-name'),
+ $this->trans('commands.plugin.debug.table-headers.plugin-type-class')
+ ];
+ $tableRows = [];
+ $serviceDefinitions = $this->container
+ ->getParameter('console.service_definitions');
+
+ foreach ($serviceDefinitions as $serviceId => $serviceDefinition) {
+ if (strpos($serviceId, 'plugin.manager.') === 0) {
+ $serviceName = substr($serviceId, 15);
+ $tableRows[$serviceName] = [
+ $serviceName,
+ $serviceDefinition->getClass()
+ ];
+ }
+ }
+
+ ksort($tableRows);
+ $io->table($tableHeader, array_values($tableRows));
+
+ return true;
+ }
+
+ $service = $this->container->get('plugin.manager.' . $pluginType);
+ if (!$service) {
+ $io->error(
+ sprintf(
+ $this->trans('commands.plugin.debug.errors.plugin-type-not-found'),
+ $pluginType
+ )
+ );
+ return false;
+ }
+
+ // Valid plugin type specified, no ID specified, show list of instances.
+ if (!$pluginId) {
+ $tableHeader = [
+ $this->trans('commands.plugin.debug.table-headers.plugin-id'),
+ $this->trans('commands.plugin.debug.table-headers.plugin-class')
+ ];
+ $tableRows = [];
+ foreach ($service->getDefinitions() as $definition) {
+ $pluginId = $definition['id'];
+ $className = $definition['class'];
+ $tableRows[$pluginId] = [$pluginId, $className];
+ }
+ ksort($tableRows);
+ $io->table($tableHeader, array_values($tableRows));
+ return true;
+ }
+
+ // Valid plugin type specified, ID specified, show the definition.
+ $definition = $service->getDefinition($pluginId);
+ $tableHeader = [
+ $this->trans('commands.plugin.debug.table-headers.definition-key'),
+ $this->trans('commands.plugin.debug.table-headers.definition-value')
+ ];
+ $tableRows = [];
+ foreach ($definition as $key => $value) {
+ if (is_object($value) && method_exists($value, '__toString')) {
+ $value = (string) $value;
+ } elseif (is_array($value) || is_object($value)) {
+ $value = Yaml::dump($value);
+ } elseif (is_bool($value)) {
+ $value = ($value) ? 'TRUE' : 'FALSE';
+ }
+ $tableRows[$key] = [$key, $value];
+ }
+ ksort($tableRows);
+ $io->table($tableHeader, array_values($tableRows));
+ return true;
+ }
+}