8000 feature #51011 [FrameworkBundle] Add parameters deprecations to the o… · symfony/symfony@4e16f7b · GitHub
[go: up one dir, main page]

Skip to content

Commit 4e16f7b

Browse files
committed
feature #51011 [FrameworkBundle] Add parameters deprecations to the output of debug:container command (HeahDude)
This PR was squashed before being merged into the 6.4 branch. Discussion ---------- [FrameworkBundle] Add parameters deprecations to the output of `debug:container` command | Q | A | ------------- | --- | Branch? | 6.4 | Bug fix? | no | New feature? | yes | Deprecations? | no | Tickets | ~ | License | MIT | Doc PR | ~ Since #47719 parameters can be deprecated but one needs to read the deprecation logs carefully. It would be convenient to have the info when dumping them with debug commands. Here's a glimpse of text format (the fixtures in tests can do the rest): <img width="1126" alt="Screenshot 2023-07-18 at 12 50 49 PM" src="https://github.com/symfony/symfony/assets/10107633/6a2ea20b-be3c-4428-bb5d-aa97f3b38803"> I don't know if we really want to support all formats since it may break BC somehow if parsers are used to read the output. I still tried to adapt them all in this PR for consistency. But JSON required an object to display both the value and the deprecation, another way could be to add a specific entry for one or all deprecations. Commits ------- 7963e9d [FrameworkBundle] Add parameters deprecations to the output of `debug:container` command
2 parents c26b264 + 7963e9d commit 4e16f7b

17 files changed

+157
-19
lines changed

src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ CHANGELOG
3030
* Change BrowserKitAssertionsTrait::getClient() to be protected
3131
* Deprecate the `framework.asset_mapper.provider` config option
3232
* Add `--exclude` option to the `cache:pool:clear` command
33+
* Add parameters deprecations to the output of `debug:container` command
3334

3435
6.3
3536
---

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,10 +129,16 @@ protected function execute(InputInterface $input, OutputInterface $output): int
129129
$options['filter'] = $this->filterToServiceTypes(...);
130130
} elseif ($input->getOption('parameters')) {
131131
$parameters = [];
132-
foreach ($object->getParameterBag()->all() as $k => $v) {
132+
$parameterBag = $object->getParameterBag();
133+
foreach ($parameterBag->all() as $k => $v) {
133134
$parameters[$k] = $object->resolveEnvPlaceholders($v);
134135
}
135136
$object = new ParameterBag($parameters);
137+
if ($parameterBag instanceof ParameterBag) {
138+
foreach ($parameterBag->allDeprecated() as $k => $deprecation) {
139+
$object->deprecate($k, ...$deprecation);
140+
}
141+
}
136142
$options = [];
137143
} elseif ($parameter = $input->getOption('parameter')) {
138144
$options = ['parameter' => $parameter];

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,19 @@ public function describe(OutputInterface $output, mixed $object, array $options
4343
(new AnalyzeServiceReferencesPass(false, false))->process($object);
4444
}
4545

46+
$deprecatedParameters = [];
47+
if ($object instanceof ContainerBuilder && isset($options['parameter']) && ($parameterBag = $object->getParameterBag()) instanceof ParameterBag) {
48+
$deprecatedParameters = $parameterBag->allDeprecated();
49+
}
50+
4651
match (true) {
4752
$object instanceof RouteCollection => $this->describeRouteCollection($object, $options),
4853
$object instanceof Route => $this->describeRoute($object, $options),
4954
$object instanceof ParameterBag => $this->describeContainerParameters($object, $options),
5055
$object instanceof ContainerBuilder && !empty($options['env-vars']) => $this->describeContainerEnvVars($this->getContainerEnvVars($object), $options),
5156
$object instanceof ContainerBuilder && isset($options['group_by']) && 'tags' === $options['group_by'] => $this->describeContainerTags($object, $options),
5257
$object instanceof ContainerBuilder && isset($options['id']) => $this->describeContainerService($this->resolveServiceDefinition($object, $options['id']), $options, $object),
53-
$object instanceof ContainerBuilder && isset($options['parameter']) => $this->describeContainerParameter($object->resolveEnvPlaceholders($object->getParameter($options['parameter'])), $options),
58+
$object instanceof ContainerBuilder && isset($options['parameter']) => $this->describeContainerParameter($object->resolveEnvPlaceholders($object->getParameter($options['parameter'])), $deprecatedParameters[$options['parameter']] ?? null, $options),
5459
$object instanceof ContainerBuilder && isset($options['deprecations']) => $this->describeContainerDeprecations($object, $options),
5560
$object instanceof ContainerBuilder => $this->describeContainerServices($object, $options),
5661
$object instanceof Definition => $this->describeContainerDefinition($object, $options),
@@ -107,7 +112,7 @@ abstract protected function describeContainerDefinition(Definition $definition,
107112

108113
abstract protected function describeContainerAlias(Alias $alias, array $options = [], ContainerBuilder $container = null): void;
109114

110-
abstract protected function describeContainerParameter(mixed $parameter, array $options = []): void;
115+
abstract protected function describeContainerParameter(mixed $parameter, ?array $deprecation, array $options = []): void;
111116

112117
abstract protected function describeContainerEnvVars(array $envs, array $options = []): void;
113118

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

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,11 +150,16 @@ protected function describeCallable(mixed $callable, array $options = []): void
150150
$this->writeData($this->getCallableData($callable), $options);
151151
}
152152

153-
protected function describeContainerParameter(mixed $parameter, array $options = []): void
153+ protected function describeContainerParameter(mixed $parameter, ?array $deprecation, array $options = []): void
154154
{
155155
$key = $options['parameter'] ?? '';
156+
$data = [$key => $parameter];
156157

157-
$this->writeData([$key => $parameter], $options);
158+
if ($deprecation) {
159+
$data['_deprecation'] = sprintf('Since %s %s: %s', $deprecation[0], $deprecation[1], sprintf(...\array_slice($deprecation, 2)));
160+
}
161+
162+
$this->writeData($data, $options);
158163
}
159164

160165
protected function describeContainerEnvVars(array $envs, array $options = []): void
@@ -223,6 +228,23 @@ protected function getRouteData(Route $route): array
223228
return $data;
224229
}
225230

231+
protected function sortParameters(ParameterBag $parameters): array
232+
{
233+
$sortedParameters = parent::sortParameters($parameters);
234+
235+
if ($deprecated = $parameters->allDeprecated()) {
236+
$deprecations = [];
237+
238+
foreach ($deprecated as $parameter => $deprecation) {
239+
$deprecations[$parameter] = sprintf('Since %s %s: %s', $deprecation[0], $deprecation[1], sprintf(...\array_slice($deprecation, 2)));
240+
}
241+
242+
$sortedParameters['_deprecations'] = $deprecations;
243+
}
244+
245+
return $sortedParameters;
246+
}
247+
226248
private function getContainerDefinitionData(Definition $definition, bool $omitTags = false, bool $showArguments = false, ContainerBuilder $container = null, string $id = null): array
227249
{
228250
$data = [

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

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,16 @@ protected function describeRoute(Route $route, array $options = []): void
7171

7272
protected function describeContainerParameters(ParameterBag $parameters, array $options = []): void
7373
{
74+
$deprecatedParameters = $parameters->allDeprecated();
75+
7476
$this->write("Container parameters\n====================\n");
7577
foreach ($this->sortParameters($parameters) as $key => $value) {
76-
$this->write(sprintf("\n- `%s`: `%s`", $key, $this->formatParameter($value)));
78+
$this->write(sprintf(
79+
"\n- `%s`: `%s`%s",
80+
$key,
81+
$this->formatParameter($value),
82+
isset($deprecatedParameters[$key]) ? sprintf(' *Since %s %s: %s*', $deprecatedParameters[$key][0], $deprecatedParameters[$key][1], sprintf(...\array_slice($deprecatedParameters[$key], 2))) : ''
83+
));
7784
}
7885
}
7986

@@ -290,9 +297,13 @@ protected function describeContainerAlias(Alias $alias, array $options = [], Con
290297
$this->describeContainerDefinition($container->getDefinition((string) $alias), array_merge($options, ['id' => (string) $alias]), $container);
291298
}
292299

293-
protected function describeContainerParameter(mixed $parameter, array $options = []): void
300+
protected function describeContainerParameter(mixed $parameter, ?array $deprecation, array $options = []): void
294301
{
295-
$this->write(isset($options['parameter']) ? sprintf("%s\n%s\n\n%s", $options['parameter'], str_repeat('=', \strlen($options['parameter'])), $this->formatParameter($parameter)) : $parameter);
302+
if (isset($options['parameter'])) {
303+
$this->write(sprintf("%s\n%s\n\n%s%s", $options['parameter'], str_repeat('=', \strlen($options['parameter'])), $this->formatParameter($parameter), $deprecation ? sprintf("\n\n*Since %s %s: %s*", $deprecation[0], $deprecation[1], sprintf(...\array_slice($deprecation, 2))) : ''));
304+
} else {
305+
$this->write($parameter);
306+
}
296307
}
297308

298309
protected function describeContainerEnvVars(array $envs, array $options = []): void

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

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Symfony\Component\Console\Formatter\OutputFormatter;
1515
use Symfony\Component\Console\Helper\Dumper;
1616
use Symfony\Component\Console\Helper\Table;
17+
use Symfony\Component\Console\Helper\TableCell;
1718
use Symfony\Component\Console\Style\SymfonyStyle;
1819
use Symfony\Component\DependencyInjection\Alias;
1920
use Symfony\Component\DependencyInjection\Argument\AbstractArgument;
@@ -124,9 +125,18 @@ protected function describeContainerParameters(ParameterBag $parameters, array $
124125
{
125126
$tableHeaders = ['Parameter', 'Value'];
126127

128+
$deprecatedParameters = $parameters->allDeprecated();
129+
127130
$tableRows = [];
128131
foreach ($this->sortParameters($parameters) as $parameter => $value) {
129132
$tableRows[] = [$parameter, $this->formatParameter($value)];
133+
134+
if (isset($deprecatedParameters[$parameter])) {
135+
$tableRows[] = [new TableCell(
136+
sprintf('<comment>(Since %s %s: %s)</comment>', $deprecatedParameters[$parameter][0], $deprecatedParameters[$parameter][1], sprintf(...\array_slice($deprecatedParameters[$parameter], 2))),
137+
['colspan' => 2]
138+
)];
139+
}
130140
}
131141

132142
$options['output']->title('Symfony Container Parameters');
@@ -425,14 +435,21 @@ protected function describeContainerAlias(Alias $alias, array $options = [], Con
425435
$this->describeContainerDefinition($container->getDefinition((string) $alias), array_merge($options, ['id' => (string) $alias]), $container);
426436
}
427437

428-
protected function describeContainerParameter(mixed $parameter, array $options = []): void
438+
protected function describeContainerParameter(mixed $parameter, ?array $deprecation, array $options = []): void
429439
{
430-
$options['output']->table(
431-
['Parameter', 'Value'],
432-
[
433-
[$options['parameter'], $this->formatParameter($parameter),
434-
],
435-
]);
440+
$parameterName = $options['parameter'];
441+
$rows = [
442+
[$parameterName, $this->formatParameter($parameter)],
443+
];
444+
445+
if ($deprecation) {
446+
$rows[] = [new TableCell(
447+
sprintf('<comment>(Since %s %s: %s)</comment>', $deprecation[0], $deprecation[1], sprintf(...\array_slice($deprecation, 2))),
448+
['colspan' => 2]
449+
)];
450+
}
451+
452+
$options['output']->table(['Parameter', 'Value'], $rows);
436453
}
437454

438455
protected function describeContainerEnvVars(array $envs, array $options = []): void

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

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,9 @@ protected function describeCallable(mixed $callable, array $options = []): void
9898
$this->writeDocument($this->getCallableDocument($callable));
9999
}
100100

101-
protected function describeContainerParameter(mixed $parameter, array $options = []): void
101+
protected function describeContainerParameter(mixed $parameter, ?array $deprecation, array $options = []): void
102102
{
103-
$this->writeDocument($this->getContainerParameterDocument($parameter, $options));
103+
$this->writeDocument($this->getContainerParameterDocument($parameter, $deprecation, $options));
104104
}
105105

106106
protected function describeContainerEnvVars(array $envs, array $options = []): void
@@ -235,10 +235,16 @@ private function getContainerParametersDocument(ParameterBag $parameters): \DOMD
235235
$dom = new \DOMDocument('1.0', 'UTF-8');
236236
$dom->appendChild($parametersXML = $dom->createElement('parameters'));
237237

238+
$deprecatedParameters = $parameters->allDeprecated();
239+
238240
foreach ($this->sortParameters($parameters) as $key => $value) {
239241
$parametersXML->appendChild($parameterXML = $dom->createElement('parameter'));
240242
$parameterXML->setAttribute('key', $key);
241243
$parameterXML->appendChild(new \DOMText($this->formatParameter($value)));
244+
245+
if (isset($deprecatedParameters[$key])) {
246+
$parameterXML->setAttribute('deprecated', sprintf('Since %s %s: %s', $deprecatedParameters[$key][0], $deprecatedParameters[$key][1], sprintf(...\array_slice($deprecatedParameters[$key], 2))));
247+
}
242248
}
243249

244250
return $dom;
@@ -475,13 +481,17 @@ private function getContainerAliasDocument(Alias $alias, string $id = null): \DO
475481
return $dom;
476482
}
477483

478-
private function getContainerParameterDocument(mixed $parameter, array $options = []): \DOMDocument
484+
private function getContainerParameterDocument(mixed $parameter, ?array $deprecation, array $options = []): \DOMDocument
479485
{
480486
$dom = new \DOMDocument('1.0', 'UTF-8');
481487
$dom->appendChild($parameterXML = $dom->createElement('parameter'));
482488

483489
if (isset($options['parameter'])) {
484490
$parameterXML->setAttribute('key', $options['parameter']);
491+
492+
if ($deprecation) {
493+
$parameterXML->setAttribute('deprecated', sprintf('Since %s %s: %s', $deprecation[0], $deprecation[1], sprintf(...\array_slice($deprecation, 2))));
494+
}
485495
}
486496

487497
$parameterXML->appendChild(new \DOMText($this->formatParameter($parameter)));

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,13 @@ public static function getDescribeContainerDefinitionWhichIsAnAliasTestData(): a
169169
return $data;
170170
}
171171

172-
/** @dataProvider getDescribeContainerParameterTestData */
172+
/**
173+
* The legacy group must be kept as deprecations will always be raised.
174+
*
175+
* @group legacy
176+
*
177+
* @dataProvider getDescribeContainerParameterTestData
178+
*/
173179
public function testDescribeContainerParameter($parameter, $expectedDescription, array $options)
174180
{
175181
$this->assertDescription($expectedDescription, $parameter, $options);
@@ -185,6 +191,9 @@ public static function getDescribeContainerParameterTestData(): array
185191
$file = array_pop($data[1]);
186192
$data[1][] = ['parameter' => 'twig.form.resources'];
187193
$data[1][] = $file;
194+
$file = array_pop($data[2]);
195+
$data[2][] = ['parameter' => 'deprecated_foo'];
196+
$data[2][] = $file;
188197

189198
return $data;
190199
}

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,14 @@ public static function getContainerParameters()
8080
'single' => FooUnitEnum::BAR,
8181
],
8282
]);
83+
84+
$parameterBag = new ParameterBag([
85+
'integer' => 12,
86+
'string' => 'Hello world!',
87+
]);
88+
$parameterBag->deprecate('string', 'symfony/framework-bundle', '6.4');
89+
90+
yield 'deprecated_parameters' => $parameterBag;
8391
}
8492

8593
public static function getContainerParameter()
@@ -92,10 +100,13 @@ public static function getContainerParameter()
92100
'form_div_layout.html.twig',
93101
'form_table_layout.html.twig',
94102
]);
103+
$builder->setParameter('deprecated_foo', 'bar');
104+
$builder->deprecateParameter('deprecated_foo', 'symfony/framework-bundle', '6.4');
95105

96106
return [
97107
'parameter' => $builder,
98108
'array_parameter' => $builder,
109+
'deprecated_parameter' => $builder,
99110
];
100111
}
101112

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"deprecated_foo": "bar",
3+
"_deprecation": "Since symfony\/framework-bundle 6.4: The parameter \"deprecated_foo\" is deprecated."
4+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
deprecated_foo
2+
==============
3+
4+
bar
5+
6+
*Since symfony/framework-bundle 6.4: The parameter "deprecated_foo" is deprecated.*
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
-------------------------------------------- -------------------------------------------
2+
 Parameter   Value 
3+
-------------------------------------------- -------------------------------------------
4+
deprecated_foo bar
5+
(Since symfony/framework-bundle 6.4: The parameter "deprecated_foo" is deprecated.)
6+
-------------------------------------------- -------------------------------------------
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<parameter key="deprecated_foo" deprecated="Since symfony/framework-bundle 6.4: The parameter &quot;deprecated_foo&quot; is deprecated.">bar</parameter>
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"integer": 12,
3+
"string": "Hello world!",
4+
"_deprecations": {
5+
"string": "Since symfony\/framework-bundle 6.4: The parameter \"string\" is deprecated."
6+
}
7+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
Container parameters
2+
====================
3+
4+
- `integer`: `12`
5+
- `string`: `Hello world!` *Since symfony/framework-bundle 6.4: The parameter "string" is deprecated.*
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
2+
Symfony Container Parameters
3+
============================
4+
5+
---------------------------------------- ---------------------------------------
6+
 Parameter   Value 
7+
---------------------------------------- ---------------------------------------
8+
integer 12
9+
string Hello world!
10+
(Since symfony/framework-bundle 6.4: The parameter "string" is deprecated.)
11+
---------------------------------------- ---------------------------------------
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<parameters>
3+
<parameter key="integer">12</parameter>
4+
<parameter key="string" deprecated="Since symfony/framework-bundle 6.4: The parameter &quot;string&quot; is deprecated.">Hello world!</parameter>
5+
</parameters>

0 commit comments

Comments
 (0)
0