Skip to content

Commit 74e33b0

Browse files
committed
annotations @Inject is deprecated, use #[Inject] (BC break)
1 parent a11727b commit 74e33b0

File tree

6 files changed

+63
-115
lines changed

6 files changed

+63
-115
lines changed

src/DI/Extensions/InjectExtension.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,9 @@ public static function getInjectProperties(string $class): array
120120
foreach ((new \ReflectionClass($class))->getProperties() as $rp) {
121121
$hasAttr = $rp->getAttributes(DI\Attributes\Inject::class);
122122
if ($hasAttr || DI\Helpers::parseAnnotation($rp, 'inject') !== null) {
123+
if (!$hasAttr) {
124+
trigger_error('Annotation @inject is deprecated, use #[Nette\DI\Attributes\Inject] and native typehint (used in ' . Reflection::toString($rp) . ')', E_USER_DEPRECATED);
125+
}
123126
if (!$rp->isPublic() || $rp->isStatic() || $rp->isReadOnly()) {
124127
throw new Nette\InvalidStateException(sprintf('Property %s for injection must not be static, readonly and must be public.', Reflection::toString($rp)));
125128
}

tests/DI/Container.inject.properties.phpt

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
declare(strict_types=1);
88

99
use Nette\DI;
10+
use Nette\DI\Attributes\Inject;
1011
use Tester\Assert;
1112

1213

@@ -23,20 +24,17 @@ class Foo implements IFoo
2324

2425
class Test1
2526
{
26-
/** @inject @var stdClass */
27-
public $varA;
28-
29-
/** @var stdClass @inject */
30-
public $varB;
27+
#[Inject]
28+
public stdClass $varA;
3129
}
3230

3331
class Test2 extends Test1
3432
{
35-
/** @var stdClass @inject */
36-
public $varC;
33+
#[Inject]
34+
public stdClass $varC;
3735

38-
/** @var IFoo @inject */
39-
public $varD;
36+
#[Inject]
37+
public IFoo $varD;
4038
}
4139

4240

@@ -52,6 +50,5 @@ $container = createContainer($builder);
5250
$test = new Test2;
5351
$container->callInjects($test);
5452
Assert::type(stdClass::class, $test->varA);
55-
Assert::type(stdClass::class, $test->varB);
5653
Assert::type(stdClass::class, $test->varC);
5754
Assert::type(Foo::class, $test->varD);

tests/DI/InjectExtension.basic.phpt

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
declare(strict_types=1);
88

99
use Nette\DI;
10+
use Nette\DI\Attributes\Inject;
1011
use Nette\DI\Definitions\Reference;
1112
use Nette\DI\Definitions\Statement;
1213
use Tester\Assert;
@@ -31,8 +32,8 @@ class ConcreteDependencyB extends AbstractDependency
3132

3233
class ParentClass
3334
{
34-
/** @var stdClass @inject */
35-
public $a;
35+
#[Inject]
36+
public stdClass $a;
3637

3738

3839
public function injectA()
@@ -47,11 +48,11 @@ class ParentClass
4748

4849
class Service extends ParentClass
4950
{
50-
/** @var stdClass @inject */
51-
public $c;
51+
#[Inject]
52+
public stdClass $c;
5253

53-
/** @var AbstractDependency @inject */
54-
public $e;
54+
#[Inject]
55+
public AbstractDependency $e;
5556

5657

5758
public function injectC()

tests/DI/InjectExtension.errors.phpt

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
declare(strict_types=1);
88

99
use Nette\DI;
10+
use Nette\DI\Attributes\Inject;
1011
use Nette\InvalidStateException;
1112
use Tester\Assert;
1213

@@ -16,35 +17,35 @@ require __DIR__ . '/../bootstrap.php';
1617

1718
class ServiceA
1819
{
19-
/** @var DateTimeImmutable @inject */
20-
public $a;
20+
#[Inject]
21+
public DateTimeImmutable $a;
2122
}
2223

2324

2425
class ServiceB
2526
{
26-
/** @var Unknown @inject */
27-
public $a;
27+
#[Inject]
28+
public Unknown $a;
2829
}
2930

3031

3132
class ServiceC
3233
{
33-
/** @inject */
34+
#[Inject]
3435
public $a;
3536
}
3637

3738

3839
class ServiceD
3940
{
40-
/** @inject */
41+
#[Inject]
4142
protected $a;
4243
}
4344

4445

4546
class ServiceE
4647
{
47-
/** @inject */
48+
#[Inject]
4849
public static $a;
4950
}
5051

tests/DI/InjectExtension.getInjectProperties().phpt

Lines changed: 35 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -6,106 +6,51 @@
66

77
declare(strict_types=1);
88

9-
namespace A
9+
use Nette\DI\Attributes\Inject;
10+
use Nette\DI\Extensions\InjectExtension;
11+
use Tester\Assert;
12+
13+
14+
class AClass
1015
{
11-
class AClass
12-
{
13-
/** @var Different @inject */
14-
public AInjected $varA;
15-
16-
/** @var B\BInjected @inject */
17-
public $varB;
18-
19-
/** @inject */
20-
public AInjected $varC;
21-
22-
/** @var AInjected */
23-
public $varD;
24-
}
25-
26-
class AInjected
27-
{
28-
}
29-
30-
class BadClass
31-
{
32-
/** @inject */
33-
public AClass|\stdClass $var;
34-
}
16+
#[Inject]
17+
public AInjected $varA;
18+
19+
#[Inject]
20+
public BInjected $varB;
21+
22+
public $varD;
23+
24+
#[Inject]
25+
public stdClass $varF;
3526
}
3627

37-
namespace A\B
28+
class BadClass
3829
{
39-
use A;
40-
use Nette\DI\Attributes\Inject;
41-
42-
class BClass extends A\AClass
43-
{
44-
#[Inject]
45-
public BInjected $varF;
46-
}
47-
48-
class BInjected
49-
{
50-
}
30+
#[Inject]
31+
public AClass|stdClass $var;
5132
}
5233

53-
namespace C
34+
class AInjected
5435
{
55-
use A\AInjected;
56-
use A\B;
57-
use C\CInjected as CAlias;
36+
}
5837

59-
class CClass
60-
{
61-
/** @var AInjected @inject */
62-
public $var1;
38+
class BInjected
39+
{
40+
}
6341

64-
/** @var B\BInjected @inject */
65-
public $var2;
6642

67-
/** @var CAlias @inject */
68-
public $var3;
43+
require __DIR__ . '/../bootstrap.php';
6944

70-
/** @var CInjected @inject */
71-
public $var4;
72-
}
7345

74-
class CInjected
75-
{
76-
}
77-
}
46+
Assert::same([
47+
'varA' => AInjected::class,
48+
'varB' => BInjected::class,
49+
'varF' => stdClass::class,
50+
], InjectExtension::getInjectProperties(AClass::class));
7851

79-
namespace {
80-
use Nette\DI\Extensions\InjectExtension;
81-
use Tester\Assert;
82-
83-
require __DIR__ . '/../bootstrap.php';
84-
85-
86-
Assert::same([
87-
'varA' => A\AInjected::class,
88-
'varB' => A\B\BInjected::class,
89-
'varC' => A\AInjected::class,
90-
], InjectExtension::getInjectProperties(A\AClass::class));
91-
92-
Assert::same([
93-
'varA' => A\AInjected::class,
94-
'varB' => A\B\BInjected::class,
95-
'varC' => A\AInjected::class,
96-
'varF' => A\B\BInjected::class,
97-
], InjectExtension::getInjectProperties(A\B\BClass::class));
98-
99-
Assert::same([
100-
'var1' => A\AInjected::class,
101-
'var2' => A\B\BInjected::class,
102-
'var3' => C\CInjected::class,
103-
'var4' => C\CInjected::class,
104-
], InjectExtension::getInjectProperties(C\CClass::class));
105-
106-
Assert::exception(
107-
fn() => InjectExtension::getInjectProperties(A\BadClass::class),
108-
Nette\InvalidStateException::class,
109-
"Type of property A\\BadClass::\$var is expected to not be nullable/built-in/complex, 'A\\AClass|stdClass' given.",
110-
);
111-
}
52+
Assert::exception(
53+
fn() => InjectExtension::getInjectProperties(BadClass::class),
54+
Nette\InvalidStateException::class,
55+
"Type of property BadClass::\$var is expected to not be nullable/built-in/complex, 'AClass|stdClass' given.",
56+
);

tests/DI/InjectExtension.getInjectProperties().traits.phpt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,12 @@ namespace A
1616
namespace B
1717
{
1818
use A\AInjected;
19+
use Nette\DI\Attributes\Inject;
1920

2021
trait BTrait
2122
{
22-
/** @var AInjected @inject */
23-
public $varA;
23+
#[Inject]
24+
public AInjected $varA;
2425
}
2526
}
2627

0 commit comments

Comments
 (0)