Completed
Push — dev ( ca0385...1f683f )
by Yan
02:15
created

UrlCompiler::buildUrlFragments()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 1
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace Lincable;
4
5
use Lincable\Parsers\Parser;
6
use Lincable\Contracts\Compilers\Compiler;
7
8
class UrlCompiler implements Compiler
9
{
10
    /**
11
     * The parser instance.
12
     *
13
     * @var \Lincable\Parsers\Parser
14
     */
15
    protected $parser;
16
17
    /**
18
     * Create a new class instance.
19
     *
20
     * @param  \Lincable\Parsers\Parser $parser
21
     * @return void
22
     */
23
    public function __construct(Parser $parser)
24
    {
25
        $this->parser = $parser;
26
    }
27
28
    /**
29
     * Compile a given url through the parser.
30
     *
31
     * @param  string $url
32
     * @return string
33
     */
34
    public function compile(string $url): string
35
    {
36
        // Parse each fragment on url.
37
        $fragments = array_map(function ($fragment) {
38
            if ($this->parser->isParameterDynamic($fragment)) {
39
40
                // We assume the parameter fragment is dynamic for
41
                // parser, then we can parse it without receiving an exception
42
                // in case the fragment is not dynamic.
43
                return $this->parser->parse($fragment);
44
            }
45
46
            return $fragment;
47
        }, $this->parseUrlFragments($url));
48
49
        return $this->buildUrlFragments($fragments);
50
    }
51
52
    /**
53
     * Get all dynamic parameters on url based on parser.
54
     *
55
     * @return array
56
     */
57
    public function parseDynamics(string $url): array
58
    {
59
        $fragments = $this->parseUrlFragments($url);
60
61
        $dynamicParameters = array_filter($fragments, function ($parameter) {
62
63
            // Determine wheter the parameter is dynamic on parser
64
            // and should be kept.
65
            return $this->parser->isParameterDynamic($parameter);
66
        });
67
68
        return array_map(function ($parameter) {
69
70
            // Return the matches for the dynamic parameter.
71
            return $this->parser->getMatches($parameter);
72
        }, array_values($dynamicParameters));
73
    }
74
75
    /**
76
     * Determine wheter the url has dynamic parameters.
77
     *
78
     * @param  string $url
79
     * @return bool
80
     */
81
    public function hasDynamics(string $url): bool
82
    {
83
        return ! empty(array_values($this->parseDynamics($url)));
84
    }
85
86
    /**
87
     * Return all url fragments.
88
     *
89
     * @param  string $url
90
     * @return array
91
     */
92
    public function parseUrlFragments(string $url): array
93
    {
94
        return explode('/', $url);
95
    }
96
97
    /**
98
     * Build an url from array fragments.
99
     *
100
     * @param  array $fragments
101
     * @return string
102
     */
103
    public function buildUrlFragments(array $fragments): string
104
    {
105
        return implode('/', $fragments);
106
    }
107
108
    /**
109
     * Set the parser used on compiler.
110
     *
111
     * @param  \Lincable\Parsers\Parser $parser
112
     * @return void
113
     */
114
    public function setParser(Parser $parser)
115
    {
116
        $this->parser = $parser;
117
    }
118
119
    /**
120
     * Get the current parser used on compiler.
121
     *
122
     * @return \Lincable\Parsers\Parser
123
     */
124
    public function getParser(): Parser
125
    {
126
        return $this->parser;
127
    }
128
}
129