Skip to content

Commit d5c083f

Browse files
committed
Initial implementation of SymfonyContainerResultCacheMetaExtension
1 parent 7417f3a commit d5c083f

5 files changed

+80
-3
lines changed

Diff for: composer.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
"require": {
1616
"php": "^7.4 || ^8.0",
1717
"ext-simplexml": "*",
18-
"phpstan/phpstan": "^2.0"
18+
"phpstan/phpstan": "^2.1.2"
1919
},
2020
"conflict": {
2121
"symfony/framework-bundle": "<3.0"

Diff for: extension.neon

+5
Original file line numberDiff line numberDiff line change
@@ -363,3 +363,8 @@ services:
363363
-
364364
factory: PHPStan\Type\Symfony\ExtensionGetConfigurationReturnTypeExtension
365365
tags: [phpstan.broker.dynamicMethodReturnTypeExtension]
366+
367+
-
368+
class: PHPStan\Symfony\SymfonyContainerResultCacheMetaExtension
369+
tags:
370+
- phpstan.resultCacheMetaExtension
+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace PHPStan\Symfony;
4+
5+
use PHPStan\Analyser\ResultCache\ResultCacheMetaExtension;
6+
use function array_map;
7+
use function hash;
8+
use function serialize;
9+
10+
final class SymfonyContainerResultCacheMetaExtension implements ResultCacheMetaExtension
11+
{
12+
13+
private ParameterMapFactory $parameterMapFactory;
14+
15+
private ServiceMapFactory $serviceMapFactory;
16+
17+
public function __construct(
18+
ParameterMapFactory $parameterMapFactory,
19+
ServiceMapFactory $serviceMapFactory
20+
)
21+
{
22+
$this->parameterMapFactory = $parameterMapFactory;
23+
$this->serviceMapFactory = $serviceMapFactory;
24+
}
25+
26+
public function getKey(): string
27+
{
28+
return 'symfonyDiContainer';
29+
}
30+
31+
public function getHash(): string
32+
{
33+
return hash('sha256', serialize([
34+
'parameters' => array_map(
35+
static fn (ParameterDefinition $parameter) => [
36+
'name' => $parameter->getKey(),
37+
'value' => $parameter->getValue(),
38+
],
39+
$this->parameterMapFactory->create()->getParameters(),
40+
),
41+
'services' => array_map(
42+
static fn (ServiceDefinition $service) => [
43+
'id' => $service->getId(),
44+
'class' => $service->getClass(),
45+
'public' => $service->isPublic() ? 'yes' : 'no',
46+
'synthetic' => $service->isSynthetic() ? 'yes' : 'no',
47+
'alias' => $service->getAlias(),
48+
],
49+
$this->serviceMapFactory->create()->getServices(),
50+
),
51+
]));
52+
}
53+
54+
}

Diff for: src/Symfony/XmlParameterMapFactory.php

+10-1
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,16 @@
88
use function base64_decode;
99
use function file_get_contents;
1010
use function is_numeric;
11+
use function ksort;
1112
use function simplexml_load_string;
1213
use function sprintf;
1314
use function strpos;
1415

1516
final class XmlParameterMapFactory implements ParameterMapFactory
1617
{
1718

19+
private ?ParameterMap $parameterMap = null;
20+
1821
private ?string $containerXml = null;
1922

2023
public function __construct(?string $containerXmlPath)
@@ -24,6 +27,10 @@ public function __construct(?string $containerXmlPath)
2427

2528
public function create(): ParameterMap
2629
{
30+
if ($this->parameterMap !== null) {
31+
return $this->parameterMap;
32+
}
33+
2734
if ($this->containerXml === null) {
2835
return new FakeParameterMap();
2936
}
@@ -52,7 +59,9 @@ public function create(): ParameterMap
5259
$parameters[$parameter->getKey()] = $parameter;
5360
}
5461

55-
return new DefaultParameterMap($parameters);
62+
ksort($parameters);
63+
64+
return $this->parameterMap = new DefaultParameterMap($parameters);
5665
}
5766

5867
/**

Diff for: src/Symfony/XmlServiceMapFactory.php

+10-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use SimpleXMLElement;
66
use function file_get_contents;
7+
use function ksort;
78
use function simplexml_load_string;
89
use function sprintf;
910
use function strpos;
@@ -12,6 +13,8 @@
1213
final class XmlServiceMapFactory implements ServiceMapFactory
1314
{
1415

16+
private ?ServiceMap $serviceMap = null;
17+
1518
private ?string $containerXml = null;
1619

1720
public function __construct(?string $containerXmlPath)
@@ -21,6 +24,10 @@ public function __construct(?string $containerXmlPath)
2124

2225
public function create(): ServiceMap
2326
{
27+
if ($this->serviceMap !== null) {
28+
return $this->serviceMap;
29+
}
30+
2431
if ($this->containerXml === null) {
2532
return new FakeServiceMap();
2633
}
@@ -85,7 +92,9 @@ public function create(): ServiceMap
8592
);
8693
}
8794

88-
return new DefaultServiceMap($services);
95+
ksort($services);
96+
97+
return $this->serviceMap = new DefaultServiceMap($services);
8998
}
9099

91100
private function cleanServiceId(string $id): string

0 commit comments

Comments
 (0)