diff --git a/src/Matcher/Converter.php b/src/Matcher/Converter.php index 0fa93eb..e8f9dee 100644 --- a/src/Matcher/Converter.php +++ b/src/Matcher/Converter.php @@ -86,6 +86,7 @@ private function transformToRegex() $route['tokens'][$token] ?? $tokenArray[$token] ); $subpatterns[$token] = "(?P<{$token}>{$tokens[$token]})"; + $tokens[$token] = $this->preparePattern($tokens[$token]); } } diff --git a/src/Matcher/Matcher.php b/src/Matcher/Matcher.php index 43f1632..810496a 100644 --- a/src/Matcher/Matcher.php +++ b/src/Matcher/Matcher.php @@ -50,6 +50,7 @@ public function match( } foreach ($this->route->getRouteArray() as $name => $route) { + //echo $route['path'];exit; if (preg_match( $route['path'], $query, diff --git a/src/UrlGenerator.php b/src/UrlGenerator.php index 4b0f8c1..460dc49 100644 --- a/src/UrlGenerator.php +++ b/src/UrlGenerator.php @@ -55,14 +55,16 @@ public function url(string $name, array $replacement): string $search = []; $replace = []; foreach ($route['tokens'] as $token => $pattern) { - $value = (string)$replacement[$token]; - if (! preg_match("/^{$pattern}$/", $value)) { - throw new RouterException( - "Value '{$value}' don't match token {{$token}} `{$pattern}` in route '{$name}'" - ); + if (array_key_exists($token, $replacement)) { + $value = (string) $replacement[$token]; + if (! preg_match($pattern, $value)) { + throw new RouterException( + "Value '{$value}' don't match token {{$token}} `{$pattern}` in route '{$name}'" + ); + } + $search[] = "{{$token}}"; + $replace[] = $value; } - $search[] = "{{$token}}"; - $replace[] = $value; } $link = str_replace( ['\\', '?', '(', ')'], diff --git a/tests/Matcher/ConverterTest.php b/tests/Matcher/ConverterTest.php index 1297fc0..c7c7c54 100644 --- a/tests/Matcher/ConverterTest.php +++ b/tests/Matcher/ConverterTest.php @@ -104,8 +104,8 @@ public function testTransformToRegex() 'name' => [ 'path' => '/^\/test\/(?P(\w+))\/(\d+)\/(?P([\w-]+))$/', 'tokens' => [ - 'token1' => '(\w+)', - 'globaltoken' => '([\w-]+)' + 'token1' => '/^(\w+)$/', + 'globaltoken' => '/^([\w-]+)$/' ], 'route' => '/test/{token1}/@digit/{globaltoken}' ] @@ -180,8 +180,8 @@ public function testConvert() 'name' => [ 'path' => '/^\/(?Ptest1)\/(?Ptest2)\/test3$/', 'tokens' => [ - 'token' => 'test1', - 'globalToken' => 'test2' + 'token' => '/^test1$/', + 'globalToken' => '/^test2$/' ], 'route' => '/{token}/{globalToken}/@pattern' ]