Skip to content

Commit 9f2aa3a

Browse files
committed
[FrameworkBundle] Improve the sorting of tagged services
1 parent 582e94f commit 9f2aa3a

File tree

9 files changed

+38
-19
lines changed

9 files changed

+38
-19
lines changed

Console/Descriptor/Descriptor.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,25 @@ protected function sortTaggedServicesByPriority(array $services): array
286286
return array_keys($maxPriority);
287287
}
288288

289+
protected function sortTagsByPriority(array $tags): array
290+
{
291+
$sortedTags = [];
292+
foreach ($tags as $tagName => $tag) {
293+
$sortedTags[$tagName] = $this->sortByPriority($tag);
294+
}
295+
296+
return $sortedTags;
297+
}
298+
299+
protected function sortByPriority(array $tag): array
300+
{
301+
usort($tag, function ($a, $b) {
302+
return ($b['priority'] ?? 0) <=> ($a['priority'] ?? 0);
303+
});
304+
305+
return $tag;
306+
}
307+
289308
/**
290309
* Gets class description from a docblock.
291310
*/

Console/Descriptor/JsonDescriptor.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ private function getContainerDefinitionData(Definition $definition, bool $omitTa
270270

271271
if (!$omitTags) {
272272
$data['tags'] = [];
273-
foreach ($definition->getTags() as $tagName => $tagData) {
273+
foreach ($this->sortTagsByPriority($definition->getTags()) as $tagName => $tagData) {
274274
foreach ($tagData as $parameters) {
275275
$data['tags'][] = ['name' => $tagName, 'parameters' => $parameters];
276276
}

Console/Descriptor/MarkdownDescriptor.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ protected function describeContainerDefinition(Definition $definition, array $op
233233
}
234234

235235
if (!(isset($options['omit_tags']) && $options['omit_tags'])) {
236-
foreach ($definition->getTags() as $tagName => $tagData) {
236+
foreach ($this->sortTagsByPriority($definition->getTags()) as $tagName => $tagData) {
237237
foreach ($tagData as $parameters) {
238238
$output .= "\n".'- Tag: `'.$tagName.'`';
239239
foreach ($parameters as $name => $value) {

Console/Descriptor/TextDescriptor.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ protected function describeContainerServices(ContainerBuilder $builder, array $o
238238
$styledServiceId = $rawOutput ? $serviceId : sprintf('<fg=cyan>%s</fg=cyan>', OutputFormatter::escape($serviceId));
239239
if ($definition instanceof Definition) {
240240
if ($showTag) {
241-
foreach ($definition->getTag($showTag) as $key => $tag) {
241+
foreach ($this->sortByPriority($definition->getTag($showTag)) as $key => $tag) {
242242
$tagValues = [];
243243
foreach ($tagsNames as $tagName) {
244244
$tagValues[] = isset($tag[$tagName]) ? $tag[$tagName] : '';

Console/Descriptor/XmlDescriptor.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,7 @@ private function getContainerDefinitionDocument(Definition $definition, string $
371371
}
372372

373373
if (!$omitTags) {
374-
if ($tags = $definition->getTags()) {
374+
if ($tags = $this->sortTagsByPriority($definition->getTags())) {
375375
$serviceXML->appendChild($tagsXML = $dom->createElement('tags'));
376376
foreach ($tags as $tagName => $tagData) {
377377
foreach ($tagData as $parameters) {

Tests/Fixtures/Descriptor/builder_priority_tag.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,16 @@
1414
{
1515
"name": "tag1",
1616
"parameters": {
17-
"attr1": "val1",
18-
"attr2": "val2",
19-
"priority": 0
17+
"attr3": "val3",
18+
"priority": 40
2019
}
2120
},
2221
{
2322
"name": "tag1",
2423
"parameters": {
25-
"attr3": "val3",
26-
"priority": 40
24+
"attr1": "val1",
25+
"attr2": "val2",
26+
"priority": 0
2727
}
2828
}
2929
]
@@ -87,4 +87,4 @@
8787
},
8888
"aliases": [],
8989
"services": []
90-
}
90+
}

Tests/Fixtures/Descriptor/builder_priority_tag.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@ Definitions
1515
- Autowired: no
1616
- Autoconfigured: no
1717
- File: `/path/to/file`
18+
- Tag: `tag1`
19+
- Attr3: val3
20+
- Priority: 40
1821
- Tag: `tag1`
1922
- Attr1: val1
2023
- Attr2: val2
2124
- Priority: 0
22-
- Tag: `tag1`
23-
- Attr3: val3
24-
- Priority: 40
2525

2626
### definition_1
2727

Tests/Fixtures/Descriptor/builder_priority_tag.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
-------------- ------- ------- ---------- ------- -----------------------
66
 Service ID   attr1   attr2   priority   attr3   Class name 
77
-------------- ------- ------- ---------- ------- -----------------------
8-
definition_3 val1 val2 0 Full\Qualified\Class3
9-
" 40 val3
8+
definition_3 40 val3 Full\Qualified\Class3
9+
" val1 val2 0
1010
definition_1 val1 30 Full\Qualified\Class1
1111
" val2
1212
definition_2 val1 val2 -20 Full\Qualified\Class2

Tests/Fixtures/Descriptor/builder_priority_tag.xml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@
22
<container>
33
<definition id="definition_3" class="Full\Qualified\Class3" public="true" synthetic="true" lazy="false" shared="true" abstract="false" autowired="false" autoconfigured="false" file="/path/to/file">
44
<tags>
5+
<tag name="tag1">
6+
<parameter name="attr3">val3</parameter>
7+
<parameter name="priority">40</parameter>
8+
</tag>
59
<tag name="tag1">
610
<parameter name="attr1">val1</parameter>
711
<parameter name="attr2">val2</parameter>
812
<parameter name="priority">0</parameter>
913
</tag>
10-
<tag name="tag1">
11-
<parameter name="attr3">val3</parameter>
12-
<parameter name="priority">40</parameter>
13-
</tag>
1414
</tags>
1515
</definition>
1616
<definition id="definition_1" class="Full\Qualified\Class1" public="true" synthetic="true" lazy="false" shared="true" abstract="false" autowired="false" autoconfigured="false" file="/path/to/file">

0 commit comments

Comments
 (0)