5 * Contains \Drupal\Console\Core\EventSubscriber\DefaultValueEventListener.
8 namespace Drupal\Console\Core\EventSubscriber;
10 use Symfony\Component\Console\ConsoleEvents;
11 use Symfony\Component\Console\Event\ConsoleCommandEvent;
12 use Symfony\Component\Console\Input\ArgvInput;
13 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
14 use Symfony\Component\Console\Command\Command;
15 use Drupal\Console\Core\Utils\ConfigurationManager;
18 * Class DefaultValueEventListener
20 * @package Drupal\Console\Core\EventSubscriber
22 class DefaultValueEventListener implements EventSubscriberInterface
25 * @var ConfigurationManager
27 protected $configurationManager;
32 private $skipCommands = [
40 * DefaultValueEventListener constructor.
42 * @param ConfigurationManager $configurationManager
44 public function __construct(
45 ConfigurationManager $configurationManager
47 $this->configurationManager = $configurationManager;
51 * @param ConsoleCommandEvent $event
53 public function setDefaultValues(ConsoleCommandEvent $event)
55 /* @var Command $command */
56 $command = $event->getCommand();
57 $configuration = $this->configurationManager
60 if (in_array($command->getName(), $this->skipCommands)) {
64 $inputDefinition = $command->getDefinition();
65 $input = $event->getInput();
66 $commandConfigKey = sprintf(
67 'application.commands.defaults.%s',
68 str_replace(':', '.', $command->getName())
70 $defaults = $configuration->get($commandConfigKey);
72 $this->setOptions($defaults, $input, $inputDefinition);
73 $this->setArguments($defaults, $input, $inputDefinition);
76 private function setOptions($defaults, $input, $inputDefinition)
78 $defaultOptions = $this->extractKey($defaults, 'options');
80 if ($defaultOptions) {
81 $reflection = new \ReflectionObject($input);
82 $prop = $reflection->getProperty('tokens');
83 $prop->setAccessible(true);
84 $tokens = $prop->getValue($input);
85 foreach ($defaultOptions as $key => $defaultValue) {
86 $option = $inputDefinition->getOption($key);
87 if ($input->getOption($key)) {
90 if ($option->acceptValue()) {
91 $defaultValues[] = sprintf(
98 $defaultValues[] = sprintf(
105 array_unique(array_merge($tokens, $defaultValues))
110 private function setArguments($defaults, $input, $inputDefinition)
112 $defaultArguments = $this->extractKey($defaults, 'arguments');
114 foreach ($defaultArguments as $key => $defaultValue) {
115 if ($input->getArgument($key)) {
119 if ($argument = $inputDefinition->getArgument($key)) {
120 $argument->setDefault($defaultValue);
125 private function extractKey($defaults, $key)
127 if (!$defaults || !is_array($defaults)) {
131 $defaults = array_key_exists($key, $defaults)?$defaults[$key]:[];
132 if (!is_array($defaults)) {
142 public static function getSubscribedEvents()
144 return [ConsoleEvents::COMMAND => 'setDefaultValues'];