Skip to content

Commit e78d4c1

Browse files
committed
DecoratorExtension: do not decorate accessors by inner type (possible BC break)
example: services: - TestControlAccessor - TestControl decorator: TestControl: setup: - method # will not decorate TestControlAccessor
1 parent 98eb0e6 commit e78d4c1

File tree

2 files changed

+52
-1
lines changed

2 files changed

+52
-1
lines changed

src/DI/Extensions/DecoratorExtension.php

+3-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,9 @@ public function addTags(string $type, array $tags): void
6363
private function findByType(string $type): array
6464
{
6565
return array_filter($this->getContainerBuilder()->getDefinitions(), function ($def) use ($type) {
66-
return is_a($def->getType(), $type, true) || is_a($def->getImplement(), $type, true);
66+
return $def->getImplementMode() === $def::IMPLEMENT_MODE_GET
67+
? is_a($def->getImplement(), $type, true)
68+
: (is_a($def->getType(), $type, true) || is_a($def->getImplement(), $type, true));
6769
});
6870
}
6971
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php
2+
3+
/**
4+
* Test: Nette\DI\Compiler: service decorators && generated factories
5+
*/
6+
7+
declare(strict_types=1);
8+
9+
use Nette\DI;
10+
use Tester\Assert;
11+
12+
13+
require __DIR__ . '/../bootstrap.php';
14+
15+
interface FooAccessor
16+
{
17+
18+
/**
19+
* @return Foo
20+
*/
21+
public function get();
22+
}
23+
24+
class Foo
25+
{
26+
}
27+
28+
29+
$compiler = new DI\Compiler;
30+
$compiler->addExtension('decorator', new Nette\DI\Extensions\DecoratorExtension);
31+
$container = createContainer($compiler, '
32+
decorator:
33+
Foo:
34+
inject: yes
35+
FooAccessor:
36+
tags: [a]
37+
services:
38+
foo: Foo
39+
acc: {implement: FooAccessor}
40+
');
41+
42+
43+
$builder = $compiler->getContainerBuilder();
44+
45+
Assert::true($builder->getDefinition('foo')->getTag('inject'));
46+
Assert::null($builder->getDefinition('foo')->getTag('a'));
47+
48+
Assert::null($builder->getDefinition('acc')->getTag('inject'));
49+
Assert::true($builder->getDefinition('acc')->getTag('a'));

0 commit comments

Comments
 (0)