Completed
Push — master ( b0867d...8ab030 )
by Alexander
24s queued 11s
created

ClassDefinition   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 33
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 5
eloc 14
dl 0
loc 33
rs 10
c 0
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A resolve() 0 16 4
1
<?php
2
namespace yii\di\definitions;
3
4
use Psr\Container\ContainerInterface;
5
use yii\di\contracts\Definition;
6
use yii\di\exceptions\InvalidConfigException;
7
8
/**
9
 * Reference points to a class name in the container
10
 */
11
class ClassDefinition implements Definition
12
{
13
    private $class;
14
15
    private $optional;
16
17
    /**
18
     * Constructor.
19
     * @param string $class the class name
20
     * @param bool $optional if null should be returned instead of throwing an exception
21
     */
22
    public function __construct(string $class, bool $optional)
23
    {
24
        $this->class = $class;
25
        $this->optional = $optional;
26
    }
27
28
    public function resolve(ContainerInterface $container, array $params = [])
29
    {
30
        try {
31
            /** @noinspection PhpMethodParametersCountMismatchInspection passing parameters for containers supporting them */
32
            $result = $container->get($this->class, $params);
0 ignored issues
show
Unused Code introduced by
The call to Psr\Container\ContainerInterface::get() has too many arguments starting with $params. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

32
            /** @scrutinizer ignore-call */ 
33
            $result = $container->get($this->class, $params);

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
33
        } catch (\Throwable $t) {
34
            if ($this->optional) {
35
                return null;
36
            }
37
            throw $t;
38
        }
39
40
        if (!$result instanceof $this->class) {
41
            throw new InvalidConfigException('Container returned incorrect type for service ' . $this->class);
42
        }
43
        return $result;
44
    }
45
}
46