1: <?php
2: 3: 4: 5: 6: 7: 8: 9:
10:
11: namespace Autarky\Routing;
12:
13: use FastRoute\RouteParser;
14:
15: class RoutePathGenerator implements RoutePathGeneratorInterface
16: {
17: 18: 19:
20: protected $routeParser;
21:
22: 23: 24: 25: 26: 27:
28: protected $validateParams;
29:
30: public function __construct(RouteParser $routeParser, $validateParams = false)
31: {
32: $this->routeParser = $routeParser;
33: $this->validateParams = (bool) $validateParams;
34: }
35:
36: 37: 38: 39: 40: 41:
42: public function setValidateParams($validateParams)
43: {
44: $this->validateParams = (bool) $validateParams;
45: }
46:
47: public function getRoutePath(Route $route, array $params)
48: {
49: $routes = $this->routeParser->parse($route->getPattern());
50:
51: foreach ($routes as $route) {
52: $path = '';
53: $index = 0;
54: foreach ($route as $part) {
55:
56: if (is_string($part)) {
57: $path .= $part;
58: continue;
59: }
60:
61:
62: if ($index === count($params)) {
63: throw new \InvalidArgumentException('Too few parameters given');
64: }
65:
66: if ($this->validateParams && $part[1] !== '[^/]+') {
67: if (!preg_match("/^{$part[1]}$/", $params[$index])) {
68: throw new \InvalidArgumentException("Route parameter pattern mismatch: "
69: ."Parameter #{$index} \"{$params[$index]}\" does not match pattern {$part[1]}");
70: }
71: }
72:
73: $path .= $params[$index++];
74: }
75:
76:
77:
78: if ($index === count($params)) {
79: return $path;
80: }
81: }
82:
83: throw new \InvalidArgumentException('Too many parameters given');
84: }
85: }
86: