Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 9d17254

Browse files
committed
Add debug autoconfigure to the container debug command
Close #26295
1 parent 6e95c2a commit 9d17254

12 files changed

+156
-5
lines changed

src/Symfony/Bundle/FrameworkBundle/Command/ContainerDebugCommand.php

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ protected function configure()
5555
new InputOption('parameter', null, InputOption::VALUE_REQUIRED, 'Displays a specific parameter for an application'),
5656
new InputOption('parameters', null, InputOption::VALUE_NONE, 'Displays parameters for an application'),
5757
new InputOption('types', null, InputOption::VALUE_NONE, 'Displays types (classes/interfaces) available in the container'),
58+
new InputOption('autoconfigure', null, InputOption::VALUE_NONE, 'Displays autoconfiguration interfaces for an application'),
5859
new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt'),
5960
new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw description'),
6061
))
@@ -71,6 +72,10 @@ protected function configure()
7172
To see available types that can be used for autowiring, use the <info>--types</info> flag:
7273
7374
<info>php %command.full_name% --types</info>
75+
76+
To see available autoconfiguration interfaces, use the <info>--autoconfigure</info> flag:
77+
78+
<info>php %command.full_name% --autoconfigure</info>
7479
7580
By default, private services are hidden. You can display all services by
7681
using the <info>--show-private</info> flag:
@@ -107,6 +112,9 @@ protected function execute(InputInterface $input, OutputInterface $output)
107112
$errorIo = $io->getErrorStyle();
108113

109114
$this->validateInput($input);
115+
if ($input->getOption('autoconfigure')) {
116+
@unlink($this->getApplication()->getKernel()->getContainer()->getParameter('debug.container.dump'));
117+
}
110118
$object = $this->getContainerBuilder();
111119

112120
if ($input->getOption('types')) {
@@ -121,6 +129,8 @@ protected function execute(InputInterface $input, OutputInterface $output)
121129
$options = array();
122130
} elseif ($parameter = $input->getOption('parameter')) {
123131
$options = array('parameter' => $parameter);
132+
} elseif ($input->getOption('autoconfigure')) {
133+
$options = array('autoconfigure' => true, 'show_private' => $input->getOption('show-private'));
124134
} elseif ($input->getOption('tags')) {
125135
$options = array('group_by' => 'tags', 'show_private' => $input->getOption('show-private'));
126136
} elseif ($tag = $input->getOption('tag')) {
@@ -139,7 +149,7 @@ protected function execute(InputInterface $input, OutputInterface $output)
139149
$options['output'] = $io;
140150
$helper->describe($io, $object, $options);
141151

142-
if (!$input->getArgument('name') && !$input->getOption('tag') && !$input->getOption('parameter') && $input->isInteractive()) {
152+
if (!$input->getArgument('name') && !$input->getOption('tag') && !$input->getOption('parameter') && !$input->getOption('autoconfigure') && $input->isInteractive()) {
143153
if ($input->getOption('tags')) {
144154
$errorIo->comment('To search for a specific tag, re-run this command with a search term. (e.g. <comment>debug:container --tag=form.type</comment>)');
145155
} elseif ($input->getOption('parameters')) {
@@ -157,7 +167,7 @@ protected function execute(InputInterface $input, OutputInterface $output)
157167
*/
158168
protected function validateInput(InputInterface $input)
159169
{
160-
$options = array('tags', 'tag', 'parameters', 'parameter');
170+
$options = array('tags', 'tag', 'parameters', 'parameter', 'autoconfigure');
161171

162172
$optionsCount = 0;
163173
foreach ($options as $option) {
@@ -168,9 +178,9 @@ protected function validateInput(InputInterface $input)
168178

169179
$name = $input->getArgument('name');
170180
if ((null !== $name) && ($optionsCount > 0)) {
171-
throw new \InvalidArgumentException('The options tags, tag, parameters & parameter can not be combined with the service name argument.');
181+
throw new \InvalidArgumentException('The options tags, tag, parameters, parameter & autoconfigure can not be combined with the service name argument.');
172182
} elseif ((null === $name) && $optionsCount > 1) {
173-
throw new \InvalidArgumentException('The options tags, tag, parameters & parameter can not be combined together.');
183+
throw new \InvalidArgumentException('The options tags, tag, parameters, parameter & autoconfigure can not be combined together.');
174184
}
175185
}
176186

src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/Descriptor.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ public function describe(OutputInterface $output, $object, array $options = arra
5050
case $object instanceof ParameterBag:
5151
$this->describeContainerParameters($object, $options);
5252
break;
53+
case $object instanceof ContainerBuilder && isset($options['autoconfigure']) && true === $options['autoconfigure']:
54+
$this->describeContainerAutoconfiguringTags($object, $options);
55+
break;
5356
case $object instanceof ContainerBuilder && isset($options['group_by']) && 'tags' === $options['group_by']:
5457
$this->describeContainerTags($object, $options);
5558
break;
@@ -120,6 +123,11 @@ abstract protected function describeContainerParameters(ParameterBag $parameters
120123
*/
121124
abstract protected function describeContainerTags(ContainerBuilder $builder, array $options = array());
122125

126+
/**
127+
* Describes container autoconfiguring tags.
128+
*/
129+
abstract protected function describeContainerAutoconfiguringTags(ContainerBuilder $builder, array $options = array());
130+
123131
/**
124132
* Describes a container service by its name.
125133
*
@@ -265,6 +273,28 @@ protected function findDefinitionsByTag(ContainerBuilder $builder, $showPrivate)
265273
return $definitions;
266274
}
267275

276+
/**
277+
* @param ContainerBuilder $builder
278+
*
279+
* @return array
280+
*/
281+
protected function getAutoconfiguredInstanceofByTag(ContainerBuilder $builder)
282+
{
283+
$autoconfiguredInstanceofByTag = array();
284+
285+
foreach ($builder->getAutoconfiguredInstanceof() as $key => $autoconfiguredInstanceof) {
286+
foreach (array_keys($autoconfiguredInstanceof->getTags()) as $tag) {
287+
if (!isset($autoconfiguredInstanceofByTag[$tag])) {
288+
$autoconfiguredInstanceofByTag[$tag] = array($key);
289+
} else {
290+
$autoconfiguredInstanceofByTag[$tag][] = $key;
291+
}
292+
}
293+
}
294+
295+
return $autoconfiguredInstanceofByTag;
296+
}
297+
268298
protected function sortParameters(ParameterBag $parameters)
269299
{
270300
$parameters = $parameters->all();

src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/JsonDescriptor.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,22 @@ protected function describeContainerTags(ContainerBuilder $builder, array $optio
7676
$this->writeData($data, $options);
7777
}
7878

79+
/**
80+
* {@inheritdoc}
81+
*/
82+
protected function describeContainerAutoconfiguringTags(ContainerBuilder $builder, array $options = array())
83+
{
84+
$data = array();
85+
86+
$autoconfiguredInstanceofByTag = $this->getAutoconfiguredInstanceofByTag($builder);
87+
88+
foreach ($autoconfiguredInstanceofByTag as $tag => $autoconfiguredInstanceofList) {
89+
$data[$tag] = $autoconfiguredInstanceofByTag[$tag];
90+
}
91+
92+
$this->writeData($data, $options);
93+
}
94+
7995
/**
8096
* {@inheritdoc}
8197
*/

src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/MarkdownDescriptor.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,24 @@ protected function describeContainerTags(ContainerBuilder $builder, array $optio
9494
}
9595
}
9696

97+
/**
98+
* {@inheritdoc}
99+
*/
100+
protected function describeContainerAutoconfiguringTags(ContainerBuilder $builder, array $options = array())
101+
{
102+
$this->write("Container autoconfiguring Tags\n==============================");
103+
104+
$autoconfiguredInstanceofByTag = $this->getAutoconfiguredInstanceofByTag($builder);
105+
106+
foreach ($autoconfiguredInstanceofByTag as $tag => $autoconfiguredInstanceofList) {
107+
$this->write("\n\n".$tag."\n".str_repeat('-', strlen($tag)));
108+
foreach ($autoconfiguredInstanceofList as $autoconfiguredInstanceof) {
109+
$this->write("\n\n");
110+
$this->write(sprintf('- %s', $autoconfiguredInstanceof));
111+
}
112+
}
113+
}
114+
97115
/**
98116
* {@inheritdoc}
99117
*/

src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/TextDescriptor.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,21 @@ protected function describeContainerTags(ContainerBuilder $builder, array $optio
136136
}
137137
}
138138

139+
/**
140+
* {@inheritdoc}
141+
*/
142+
protected function describeContainerAutoconfiguringTags(ContainerBuilder $builder, array $options = array())
143+
{
144+
$options['output']->title('Symfony Container Autoconfiguring Tags');
145+
146+
$autoconfiguredInstanceofByTag = $this->getAutoconfiguredInstanceofByTag($builder);
147+
148+
foreach ($autoconfiguredInstanceofByTag as $tag => $autoconfiguredInstanceofList) {
149+
$options['output']->section(sprintf('"%s" tag', $tag));
150+
$options['output']->listing($autoconfiguredInstanceofList);
151+
}
152+
}
153+
139154
/**
140155
* {@inheritdoc}
141156
*/

src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/XmlDescriptor.php

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,14 @@ protected function describeContainerTags(ContainerBuilder $builder, array $optio
6161
$this->writeDocument($this->getContainerTagsDocument($builder, isset($options['show_private']) && $options['show_private']));
6262
}
6363

64+
/**
65+
* {@inheritdoc}
66+
*/
67+
protected function describeContainerAutoconfiguringTags(ContainerBuilder $builder, array $options = array())
68+
{
69+
$this->writeDocument($this->getContainerAutoconfiguringTagsDocument($builder));
70+
}
71+
6472
/**
6573
* {@inheritdoc}
6674
*/
@@ -141,7 +149,10 @@ private function writeDocument(\DOMDocument $dom)
141149
$this->write($dom->saveXML());
142150
}
143151

144-
private function getRouteCollectionDocument(RouteCollection $routes): \DOMDocument
152+
/**
153+
* @return \DOMDocument
154+
*/
155+
private function getRouteCollectionDocument(RouteCollection $routes)
145156
{
146157
$dom = new \DOMDocument('1.0', 'UTF-8');
147158
$dom->appendChild($routesXML = $dom->createElement('routes'));
@@ -249,6 +260,26 @@ private function getContainerTagsDocument(ContainerBuilder $builder, bool $showP
249260
return $dom;
250261
}
251262

263+
private function getContainerAutoconfiguringTagsDocument(ContainerBuilder $builder): \DOMDocument
264+
{
265+
$dom = new \DOMDocument('1.0', 'UTF-8');
266+
$dom->appendChild($containerXML = $dom->createElement('tags'));
267+
268+
$autoconfiguredInstanceofByTag = $this->getAutoconfiguredInstanceofByTag($builder);
269+
270+
foreach ($autoconfiguredInstanceofByTag as $tag => $autoconfiguredInstanceofList) {
271+
$containerXML->appendChild($tagXML = $dom->createElement('tag'));
272+
$tagXML->setAttribute('name', $tag);
273+
274+
foreach ($autoconfiguredInstanceofList as $autoconfiguredInstanceof) {
275+
$tagXML->appendChild($autoconfiguredInstanceofXML = $dom->createElement('autoconfigured-instanceof'));
276+
$autoconfiguredInstanceofXML->appendChild(new \DOMText($autoconfiguredInstanceof));
277+
}
278+
}
279+
280+
return $dom;
281+
}
282+
252283
private function getContainerServiceDocument($service, string $id, ContainerBuilder $builder = null, bool $showArguments = false): \DOMDocument
253284
{
254285
$dom = new \DOMDocument('1.0', 'UTF-8');

src/Symfony/Bundle/FrameworkBundle/Tests/Console/Descriptor/AbstractDescriptorTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,7 @@ private function getContainerBuilderDescriptionTestData(array $objects)
218218
'tag1' => array('show_private' => true, 'tag' => 'tag1'),
219219
'tags' => array('group_by' => 'tags', 'show_private' => true),
220220
'arguments' => array('show_private' => false, 'show_arguments' => true),
221+
'autoconfigure' => array('autoconfigure' => true),
221222
);
222223

223224
$data = array();

src/Symfony/Bundle/FrameworkBundle/Tests/Console/Descriptor/ObjectsProvider.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ public static function getContainerBuilders()
9292
$builder1 = new ContainerBuilder();
9393
$builder1->setDefinitions(self::getContainerDefinitions());
9494
$builder1->setAliases(self::getContainerAliases());
95+
$builder1->registerForAutoconfiguration(AutoconfiguringInterface::class)->addTag('autoconfiguring_interface_tag');
9596

9697
return array('builder_1' => $builder1);
9798
}
@@ -196,3 +197,7 @@ public function compile()
196197
return new CompiledRoute('', '#PATH_REGEX#', array(), array(), '#HOST_REGEX#');
197198
}
198199
}
200+
201+
interface AutoconfiguringInterface
202+
{
203+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"autoconfiguring_interface_tag": [
3+
"Symfony\\Bundle\\FrameworkBundle\\Tests\\Console\\Descriptor\\AutoconfiguringInterface"
4+
]
5+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
Container autoconfiguring Tags
2+
==============================
3+
4+
autoconfiguring_interface_tag
5+
-----------------------------
6+
7+
- Symfony\Bundle\FrameworkBundle\Tests\Console\Descriptor\AutoconfiguringInterface
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
Symfony Container Autoconfiguring Tags
2+
======================================
3+
4+
"autoconfiguring_interface_tag" tag
5+
-----------------------------------
6+
7+
* Symfony\Bundle\FrameworkBundle\Tests\Console\Descriptor\AutoconfiguringInterface
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<tags>
3+
<tag name="autoconfiguring_interface_tag">
4+
<autoconfigured-instanceof>Symfony\Bundle\FrameworkBundle\Tests\Console\Descriptor\AutoconfiguringInterface</autoconfigured-instanceof>
5+
</tag>
6+
</tags>

0 commit comments

Comments
 (0)