25d427396f4f64f0b458d1b7cb95152fe92711c1
[yaffs-website] / vendor / drupal / console-core / src / EventSubscriber / DefaultValueEventListener.php
1 <?php
2
3 /**
4  * @file
5  * Contains \Drupal\Console\Core\EventSubscriber\DefaultValueEventListener.
6  */
7
8 namespace Drupal\Console\Core\EventSubscriber;
9
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;
16
17 /**
18  * Class DefaultValueEventListener
19  *
20  * @package Drupal\Console\Core\EventSubscriber
21  */
22 class DefaultValueEventListener implements EventSubscriberInterface
23 {
24     /**
25      * @var ConfigurationManager
26      */
27     protected $configurationManager;
28
29     /**
30      * @var array
31      */
32     private $skipCommands = [
33         'self-update',
34         'list',
35         'chain',
36         'drush'
37     ];
38
39     /**
40      * DefaultValueEventListener constructor.
41      *
42      * @param ConfigurationManager $configurationManager
43      */
44     public function __construct(
45         ConfigurationManager $configurationManager
46     ) {
47         $this->configurationManager = $configurationManager;
48     }
49
50     /**
51      * @param ConsoleCommandEvent $event
52      */
53     public function setDefaultValues(ConsoleCommandEvent $event)
54     {
55         /* @var Command $command */
56         $command = $event->getCommand();
57         $configuration = $this->configurationManager
58             ->getConfiguration();
59
60         if (in_array($command->getName(), $this->skipCommands)) {
61             return;
62         }
63
64         $inputDefinition = $command->getDefinition();
65         $input = $event->getInput();
66         $commandConfigKey = sprintf(
67             'application.commands.defaults.%s',
68             str_replace(':', '.', $command->getName())
69         );
70         $defaults = $configuration->get($commandConfigKey);
71
72         $this->setOptions($defaults, $input, $inputDefinition);
73         $this->setArguments($defaults, $input, $inputDefinition);
74     }
75
76     private function setOptions($defaults, $input, $inputDefinition)
77     {
78         $defaultOptions = $this->extractKey($defaults, 'options');
79         $defaultValues = [];
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)) {
88                     continue;
89                 }
90                 if ($option->acceptValue()) {
91                     $defaultValues[] = sprintf(
92                         '--%s=%s',
93                         $key,
94                         $defaultValue
95                     );
96                     continue;
97                 }
98                 $defaultValues[] = sprintf(
99                     '--%s',
100                     $key
101                 );
102             }
103             $prop->setValue(
104                 $input,
105                 array_unique(array_merge($tokens, $defaultValues))
106             );
107         }
108     }
109
110     private function setArguments($defaults, $input, $inputDefinition)
111     {
112         $defaultArguments = $this->extractKey($defaults, 'arguments');
113
114         foreach ($defaultArguments as $key => $defaultValue) {
115             if ($input->getArgument($key)) {
116                 continue;
117             }
118
119             if ($argument = $inputDefinition->getArgument($key)) {
120                 $argument->setDefault($defaultValue);
121             }
122         }
123     }
124
125     private function extractKey($defaults, $key)
126     {
127         if (!$defaults || !is_array($defaults)) {
128             return [];
129         }
130
131         $defaults = array_key_exists($key, $defaults)?$defaults[$key]:[];
132         if (!is_array($defaults)) {
133             return [];
134         }
135
136         return $defaults;
137     }
138
139     /**
140      * @{@inheritdoc}
141      */
142     public static function getSubscribedEvents()
143     {
144         return [ConsoleEvents::COMMAND => 'setDefaultValues'];
145     }
146 }