Skip to content

Commit a300c8b

Browse files
committed
DecoratorExtension: do not decorate accessors by inner type (possible BC break)
1 parent 95b5869 commit a300c8b

File tree

2 files changed

+49
-1
lines changed

2 files changed

+49
-1
lines changed

src/DI/Extensions/DecoratorExtension.php

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

0 commit comments

Comments
 (0)