Completed
Push — master ( a9f59f...72efb5 )
by Vítor
16:45
created

RouteCollectionBuilder::processRoute()   C

Complexity

Conditions 7
Paths 48

Size

Total Lines 24
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 1 Features 1
Metric Value
c 2
b 1
f 1
dl 0
loc 24
rs 6.7272
cc 7
eloc 16
nc 48
nop 2
1
<?php
2
/**
3
 * ZfDebugModule. Console commands and other utilities for debugging ZF2 apps.
4
 *
5
 * @license http://www.opensource.org/licenses/mit-license.html MIT License
6
 * @copyright 2016 Vítor Brandão <[email protected]>
7
 */
8
9
namespace Noiselabs\ZfDebugModule\Util\Routing;
10
11
/**
12
 * RouteCollectionBuilder is only able to build FlatRouteCollection(s).
13
 */
14
class RouteCollectionBuilder
15
{
16
    /**
17
     * @var array
18
     */
19
    private $routes;
20
21
    /**
22
     * RoutesInspector constructor.
23
     *
24
     * @param array $routes
25
     */
26
    public function __construct(array $routes)
27
    {
28
        $this->routes = $routes;
29
    }
30
31
    /**
32
     * @return FlatRouteCollection
33
     */
34
    public function build()
35
    {
36
        return $this->processRoutes(new FlatRouteCollection(), $this->routes);
37
    }
38
39
    /**
40
     * @param FlatRouteCollection $routeCollection
41
     * @param array               $routesConfig
42
     * @param Route               $parentRoute
43
     *
44
     * @return FlatRouteCollection
45
     */
46
    private function processRoutes(FlatRouteCollection $routeCollection, array $routesConfig, Route $parentRoute = null)
47
    {
48
        foreach (array_keys($routesConfig) as $k) {
49
            $childRoutes = null;
50
            if (isset($routesConfig[$k]['child_routes']) && !empty($routesConfig[$k]['child_routes'])) {
51
                $childRoutes = $routesConfig[$k]['child_routes'];
52
                unset($routesConfig[$k]['child_routes']);
53
            }
54
55
            $routesConfig[$k]['name'] = $k;
56
            $route = $this->processRoute($routesConfig[$k], $parentRoute);
57
            if (!isset($routesConfig[$k]['may_terminate']) || false !== $routesConfig[$k]['may_terminate']) {
58
                $routeCollection->addRoute($route);
59
            }
60
61
            if (null !== $childRoutes) {
62
                $this->processRoutes($routeCollection, $childRoutes, $route);
63
            }
64
        }
65
66
        return $routeCollection;
67
    }
68
69
    /**
70
     * @param array      $routeConfig
71
     * @param Route|null $parentRoute
72
     *
73
     * @return Route
74
     */
75
    private function processRoute(array $routeConfig, Route $parentRoute = null)
76
    {
77
        $name = $routeConfig['name'];
78
        $url = isset($routeConfig['options']['route']) ? $routeConfig['options']['route'] : '';
79
        $controller = isset($routeConfig['options']['defaults']['controller'])
80
            ? $routeConfig['options']['defaults']['controller'] : null;
81
        $action = isset($routeConfig['options']['defaults']['action'])
82
            ? $routeConfig['options']['defaults']['action'] : null;
83
84
        if (null !== $parentRoute) {
85
            $name = $parentRoute->getName() . '/' . $name;
86
            $url = $parentRoute->getUrl() . $url;
87
            if (null === $controller) {
88
                $controller = $parentRoute->getController();
89
            }
90
        }
91
92
        if (null === $action) {
93
            $action = 'index';
94
        }
95
        $action .= 'Action';
96
97
        return new Route($name, $url, $controller, $action);
98
    }
99
}
100