33namespace PHPStan \DependencyInjection ;
44
55use Nette \DI \CompilerExtension ;
6+ use Nette \DI \Definitions \Reference ;
7+ use Nette \DI \Helpers ;
8+ use Nette \Utils \Strings ;
69use olvlvl \ComposerAttributeCollector \Attributes ;
710use ReflectionClass ;
11+ use function strtolower ;
12+ use function substr ;
813
914final class AutowiredAttributeServicesExtension extends CompilerExtension
1015{
@@ -15,6 +20,8 @@ public function loadConfiguration(): void
1520 $ autowiredServiceClasses = Attributes::findTargetClasses (AutowiredService::class);
1621 $ builder = $ this ->getContainerBuilder ();
1722
23+ $ autowiredParameters = Attributes::findTargetMethodParameters (AutowiredParameter::class);
24+
1825 foreach ($ autowiredServiceClasses as $ class ) {
1926 $ reflection = new ReflectionClass ($ class ->name );
2027 $ attribute = $ class ->attribute ;
@@ -23,6 +30,30 @@ public function loadConfiguration(): void
2330 ->setType ($ class ->name )
2431 ->setAutowired ();
2532
33+ foreach ($ autowiredParameters as $ autowiredParameter ) {
34+ if (strtolower ($ autowiredParameter ->method ) !== '__construct ' ) {
35+ continue ;
36+ }
37+ if (strtolower ($ autowiredParameter ->class ) !== strtolower ($ class ->name )) {
38+ continue ;
39+ }
40+ $ ref = $ autowiredParameter ->attribute ->ref ;
41+ if ($ ref === null ) {
42+ $ argument = Helpers::expand (
43+ '% ' . Helpers::escape ($ autowiredParameter ->name ) . '% ' ,
44+ $ builder ->parameters ,
45+ );
46+ } elseif (Strings::match ($ ref , '#^@[\w \\\\]+$#D ' ) !== null ) {
47+ $ argument = new Reference (substr ($ ref , 1 ));
48+ } else {
49+ $ argument = Helpers::expand (
50+ $ ref ,
51+ $ builder ->parameters ,
52+ );
53+ }
54+ $ definition ->setArgument ($ autowiredParameter ->name , $ argument );
55+ }
56+
2657 foreach (ValidateServiceTagsExtension::INTERFACE_TAG_MAPPING as $ interface => $ tag ) {
2758 if (!$ reflection ->implementsInterface ($ interface )) {
2859 continue ;
0 commit comments