Completed
Pull Request — master (#570)
by
unknown
01:17
created

RouteDocBlocker::getCachedDocBlock()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 6
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 3
1
<?php
2
3
namespace Mpociot\ApiDoc\Tools;
4
5
use ReflectionClass;
6
use Illuminate\Routing\Route;
7
use Mpociot\Reflection\DocBlock;
8
9
class RouteDocBlocker
10
{
11
    public static $docBlocks = [];
12
13
    public static function getDocBlocksFromRoute(Route $route)
14
    {
15
        list($className, $methodName) = Utils::getRouteClassAndMethodNames($route);
16
        $docBlocks = self::getCachedDocBlock($route, $className, $methodName);
17
        if ($docBlocks) {
18
            return $docBlocks;
19
        }
20
21
        $class = new ReflectionClass($className);
22
23
        if (! $class->hasMethod($methodName)) {
24
            throw new \Exception("Error while fetching docblock for route: Class $className does not contain method $methodName");
25
        }
26
27
        $docBlocks = [
28
            'method' => new DocBlock($class->getMethod($methodName)->getDocComment() ?: ''),
29
            'class' => new DocBlock($class->getDocComment() ?: ''),
30
        ];
31
        self::cacheDocBlocks($route, $className, $methodName, $docBlocks);
32
33
        return $docBlocks;
34
    }
35
36
    protected static function getCachedDocBlock(Route $route, string $className, string $methodName)
37
    {
38
        $routeId = self::getRouteId($route, $className, $methodName);
39
40
        return self::$docBlocks[$routeId] ?? null;
41
    }
42
43
    protected static function cacheDocBlocks(Route $route, string $className, string $methodName, array $docBlocks)
44
    {
45
        $routeId = self::getRouteId($route, $className, $methodName);
46
        self::$docBlocks[$routeId] = $docBlocks;
47
    }
48
49
    private static function getRouteId(Route $route, string $className, string $methodName)
50
    {
51
        return $route->uri()
52
            .':'
53
            .implode(array_diff($route->methods(), ['HEAD']))
54
            .$className
55
            .$methodName;
56
    }
57
}
58