RouteReflection   A
last analyzed

Complexity

Total Complexity 13

Size/Duplication

Total Lines 87
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Importance

Changes 0
Metric Value
wmc 13
lcom 1
cbo 2
dl 0
loc 87
rs 10
c 0
b 0
f 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
A createReflection() 0 7 2
A getPointersAndReturnRequired() 0 4 1
B resolveParameters() 0 20 5
A checkClassRegisterContainer() 0 7 2
A getParametersObject() 0 10 3
1
<?php
2
3
namespace Preetender\Routing;
4
5
use League\Container\Exception\ContainerException;
6
7
/**
8
 * Trait RouteReflection
9
 * @package Preetender\Routing
10
 */
11
trait RouteReflection
12
{
13
    /** @var array */
14
    protected static $numberOfParameters = [];
15
16
    /** @var */
17
    protected static $reflectionObject;
18
19
    /** @var null  */
20
    protected static $resolveMethodName = null;
21
22
    /**
23
     * @param object $object
24
     * @param string|null $method
25
     */
26
    protected static function createReflection($object, string $method = null)
27
    {
28
        self::$reflectionObject = $object;
29
        if($method) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $method of type null|string is loosely compared to true; this is ambiguous if the string can be empty. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
30
            self::$resolveMethodName = $method;
0 ignored issues
show
Documentation Bug introduced by
It seems like $method of type string is incompatible with the declared type null of property $resolveMethodName.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
31
        }
32
    }
33
34
    /**
35
     * @param int $position
36
     * @return int
37
     */
38
    protected static function getPointersAndReturnRequired(int $position)
39
    {
40
        return self::$parameters[ array_flip( self::$numberOfParameters)[$position] ];
41
    }
42
43
    /**
44
     * ...
45
     * @return array
46
     */
47
    protected static function resolveParameters()
48
    {
49
        $attributes = [];
50
        $parameters = self::getParametersObject();
51
        if(count($parameters) > 0) {
52
            foreach ($parameters as $parameter) {
53
                /** @var \ReflectionParameter $parameter */
54
                if(!$parameter->getClass()) {
55
                    self::$numberOfParameters[] = $parameter->getPosition();
56
                    $attributes[$parameter->getPosition()] = self::getPointersAndReturnRequired($parameter->getPosition());
57
                    continue;
58
                }
59
                $className = $parameter->getClass()->getName();
60
                if(self::checkClassRegisterContainer($className)) {
61
                    $attributes[$parameter->getPosition()] = Kernel::getContainer()->get($className);
62
                }
63
            }
64
        }
65
        return $attributes;
66
    }
67
68
    /**
69
     * Check whether injected class is registered in container.
70
     *
71
     * @param string $className
72
     * @return bool
73
     */
74
    protected static function checkClassRegisterContainer(string $className)
75
    {
76
        if(!Kernel::getContainer()->has($className)) {
77
            throw new ContainerException("Class [{$className}] not registered in the container.");
78
        }
79
        return true;
80
    }
81
82
    /**
83
     * Get all parameters to object
84
     *
85
     * @return mixed
86
     */
87
    protected static function getParametersObject()
88
    {
89
        if( self::$reflectionObject instanceof \ReflectionClass) {
90
            $method = self::$reflectionObject->getMethod(self::$resolveMethodName);
91
            return $method->getParameters();
92
        }
93
        if ( self::$reflectionObject instanceof \ReflectionFunction) {
94
            return self::$reflectionObject->getParameters();
95
        }
96
    }
97
}