Completed
Push — master ( 5e1cd2...38f1ea )
by Matze
03:32
created

ControllerCompilerPass   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 80
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Test Coverage

Coverage 92.86%

Importance

Changes 15
Bugs 1 Features 3
Metric Value
wmc 8
c 15
b 1
f 3
lcom 1
cbo 4
dl 0
loc 80
ccs 26
cts 28
cp 0.9286
rs 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
A dumpMatcher() 0 15 1
B process() 0 26 5
A createRoute() 0 17 2
1
<?php
2
3
namespace BrainExe\Core\DependencyInjection\CompilerPass;
4
5
use BrainExe\Core\Annotations\CompilerPass;
6
use BrainExe\Core\Annotations\Route as RouteAnnotation;
7
use BrainExe\Core\Application\SerializedRouteCollection;
8
use BrainExe\Core\Traits\FileCacheTrait;
9
use Exception;
10
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
11
use Symfony\Component\DependencyInjection\ContainerBuilder;
12
use Symfony\Component\Routing\Matcher\Dumper\PhpMatcherDumper;
13
use Symfony\Component\Routing\Route;
14
15
/**
16
 * @CompilerPass(priority=5)
17
 */
18
class ControllerCompilerPass implements CompilerPassInterface
19
{
20
    use FileCacheTrait;
21
22
    const CONTROLLER_TAG = 'controller';
23
    const ROUTE_TAG      = 'route';
24
25
    /**
26
     * {@inheritdoc}
27
     */
28 3
    public function process(ContainerBuilder $container)
29
    {
30 3
        $controllers = $container->findTaggedServiceIds(self::ROUTE_TAG);
31
32 3
        $serialized = [];
33 3
        foreach ($controllers as $controllerId => $tag) {
34 3
            foreach ($tag as $routeRaw) {
35
                /** @var RouteAnnotation $route */
36 3
                $route = $routeRaw[0];
37
38 3
                $name = $route->getName();
39 3
                if (empty($name)) {
40
                    throw new Exception(sprintf('"name" is missing for @Route(%s)', $controllerId));
41 3
                } elseif (isset($serialized[$name])) {
42
                    throw new Exception(sprintf('Route name %s does already exits in %s', $name, $controllerId));
43
                }
44
45 3
                $serialized[$name] = serialize($this->createRoute($route));
46
            }
47
48 3
            $controller = $container->getDefinition($controllerId);
49 3
            $controller->clearTag(self::ROUTE_TAG);
50
        }
51
52 3
        $this->dumpMatcher($container, $serialized);
53 3
    }
54
55
    /**
56
     * @param RouteAnnotation $route
57
     * @return Route
58
     */
59 3
    private function createRoute(RouteAnnotation $route)
60
    {
61 3
        if ($route->isCsrf()) {
62 1
            $route->setOptions(['csrf' => true]);
63
        }
64
65 3
        return new Route(
66 3
            $route->getPath(),
67 3
            $route->getDefaults(),
68 3
            $route->getRequirements(),
69 3
            $route->getOptions(),
70 3
            $route->getHost(),
71 3
            $route->getSchemes(),
72 3
            $route->getMethods(),
73 3
            $route->getCondition()
74
        );
75
    }
76
77
    /**
78
     * @param ContainerBuilder $container
79
     * @param array $routes
80
     * @codeCoverageIgnore
81
     */
82
    protected function dumpMatcher(ContainerBuilder $container, array $routes)
83
    {
84
        ksort($routes);
85
86
        $this->dumpVariableToCache(SerializedRouteCollection::CACHE_FILE, $routes);
87
88
        /** @var SerializedRouteCollection $routerCollection */
89
        $routerCollection = $container->get('Core.RouteCollection');
90
91
        $routerFile  = sprintf('%scache/router_matcher.php', ROOT);
92
        $routeDumper = new PhpMatcherDumper($routerCollection);
93
        $content     = $routeDumper->dump();
94
        file_put_contents($routerFile, $content);
95
        @chmod($routerFile, 0777);
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition here. This can introduce security issues, and is generally not recommended.

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
96
    }
97
}
98