Skip to content

Commit 5c03b26

Browse files
committed
#[NonAutowiredService] attribute
1 parent b85cce6 commit 5c03b26

File tree

6 files changed

+65
-31
lines changed

6 files changed

+65
-31
lines changed

conf/services.neon

Lines changed: 7 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,13 @@ services:
4242
autowired:
4343
- PHPStan\BetterReflection\SourceLocator\SourceStubber\ReflectionSourceStubber
4444

45+
originalBetterReflectionReflector:
46+
class: PHPStan\BetterReflection\Reflector\DefaultReflector
47+
arguments:
48+
sourceLocator: @betterReflectionSourceLocator
49+
autowired: false
50+
51+
4552
# not registered using attributes because we don't want to apply service tags automatically
4653
-
4754
class: PHPStan\Dependency\ExportedNodeVisitor
@@ -235,32 +242,3 @@ services:
235242
nodeScopeResolverReflector:
236243
factory: @betterReflectionReflector
237244
autowired: false
238-
239-
# could be registered using attributes
240-
241-
simpleRelativePathHelper:
242-
factory: PHPStan\File\SimpleRelativePathHelper
243-
arguments:
244-
currentWorkingDirectory: %currentWorkingDirectory%
245-
autowired: false
246-
247-
parentDirectoryRelativePathHelper:
248-
factory: PHPStan\File\ParentDirectoryRelativePathHelper
249-
arguments:
250-
parentDirectory: %currentWorkingDirectory%
251-
autowired: false
252-
253-
# Reflection providers
254-
255-
betterReflectionProvider:
256-
class: PHPStan\Reflection\BetterReflection\BetterReflectionProvider
257-
arguments:
258-
reflector: @betterReflectionReflector
259-
universalObjectCratesClasses: %universalObjectCratesClasses%
260-
autowired: false
261-
262-
originalBetterReflectionReflector:
263-
class: PHPStan\BetterReflection\Reflector\DefaultReflector
264-
arguments:
265-
sourceLocator: @betterReflectionSourceLocator
266-
autowired: false

src/DependencyInjection/AutowiredAttributeServicesExtension.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,21 @@ public function loadConfiguration(): void
6464
}
6565
}
6666

67+
foreach (Attributes::findTargetClasses(NonAutowiredService::class) as $class) {
68+
$attribute = $class->attribute;
69+
70+
$definition = $builder->addDefinition($attribute->name)
71+
->setType($class->name)
72+
->setAutowired(false);
73+
74+
if ($attribute->factory !== null) {
75+
[$ref, $method] = explode('::', $attribute->factory);
76+
$definition->setFactory(new Statement([new Reference(substr($ref, 1)), $method]));
77+
}
78+
79+
$this->processParameters($class->name, $definition, $autowiredParameters);
80+
}
81+
6782
foreach (Attributes::findTargetClasses(GenerateFactory::class) as $class) {
6883
$attribute = $class->attribute;
6984
$definition = $builder->addFactoryDefinition(null)
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace PHPStan\DependencyInjection;
4+
5+
use Attribute;
6+
7+
/**
8+
* Registers a non-autowired named service in the DI container.
9+
10+
* Works thanks to https://github.com/ondrejmirtes/composer-attribute-collector
11+
* and AutowiredAttributeServicesExtension.
12+
*/
13+
#[Attribute(flags: Attribute::TARGET_CLASS)]
14+
final class NonAutowiredService
15+
{
16+
17+
public function __construct(
18+
public string $name,
19+
public ?string $factory = null,
20+
)
21+
{
22+
}
23+
24+
}

src/File/ParentDirectoryRelativePathHelper.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
namespace PHPStan\File;
44

5+
use PHPStan\DependencyInjection\AutowiredParameter;
6+
use PHPStan\DependencyInjection\NonAutowiredService;
57
use PHPStan\ShouldNotHappenException;
68
use function array_fill;
79
use function array_merge;
@@ -14,10 +16,14 @@
1416
use function substr;
1517
use function trim;
1618

19+
#[NonAutowiredService(name: 'parentDirectoryRelativePathHelper')]
1720
final class ParentDirectoryRelativePathHelper implements RelativePathHelper
1821
{
1922

20-
public function __construct(private string $parentDirectory)
23+
public function __construct(
24+
#[AutowiredParameter(ref: '%currentWorkingDirectory%')]
25+
private string $parentDirectory,
26+
)
2127
{
2228
}
2329

src/File/SimpleRelativePathHelper.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,21 @@
22

33
namespace PHPStan\File;
44

5+
use PHPStan\DependencyInjection\AutowiredParameter;
6+
use PHPStan\DependencyInjection\NonAutowiredService;
57
use function str_replace;
68
use function str_starts_with;
79
use function strlen;
810
use function substr;
911

12+
#[NonAutowiredService(name: 'simpleRelativePathHelper')]
1013
final class SimpleRelativePathHelper implements RelativePathHelper
1114
{
1215

13-
public function __construct(private string $currentWorkingDirectory)
16+
public function __construct(
17+
#[AutowiredParameter(ref: '%currentWorkingDirectory%')]
18+
private string $currentWorkingDirectory,
19+
)
1420
{
1521
}
1622

src/Reflection/BetterReflection/BetterReflectionProvider.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
use PHPStan\Broker\ClassNotFoundException;
2121
use PHPStan\Broker\ConstantNotFoundException;
2222
use PHPStan\Broker\FunctionNotFoundException;
23+
use PHPStan\DependencyInjection\AutowiredParameter;
24+
use PHPStan\DependencyInjection\NonAutowiredService;
2325
use PHPStan\DependencyInjection\Reflection\ClassReflectionExtensionRegistryProvider;
2426
use PHPStan\File\FileHelper;
2527
use PHPStan\File\FileReader;
@@ -61,6 +63,7 @@
6163
use function strtolower;
6264
use const PHP_VERSION_ID;
6365

66+
#[NonAutowiredService(name: 'betterReflectionProvider')]
6467
final class BetterReflectionProvider implements ReflectionProvider
6568
{
6669

@@ -83,6 +86,7 @@ public function __construct(
8386
private ReflectionProvider\ReflectionProviderProvider $reflectionProviderProvider,
8487
private InitializerExprTypeResolver $initializerExprTypeResolver,
8588
private ClassReflectionExtensionRegistryProvider $classReflectionExtensionRegistryProvider,
89+
#[AutowiredParameter(ref: '@betterReflectionReflector')]
8690
private Reflector $reflector,
8791
private FileTypeMapper $fileTypeMapper,
8892
private PhpDocInheritanceResolver $phpDocInheritanceResolver,
@@ -97,6 +101,7 @@ public function __construct(
97101
private PhpStormStubsSourceStubber $phpstormStubsSourceStubber,
98102
private SignatureMapProvider $signatureMapProvider,
99103
private AttributeReflectionFactory $attributeReflectionFactory,
104+
#[AutowiredParameter(ref: '%universalObjectCratesClasses%')]
100105
private array $universalObjectCratesClasses,
101106
)
102107
{

0 commit comments

Comments
 (0)