<?php
/**
* Description of Router
*
* @author home
*/
namespace Core;
class Router
{
public $routes = [];
public $params = [];
public function addRoute(string $route, string $controller, string $action)
{
//экранируем слеши внутри
//вычленяем параметры из строки запроса в фигурных скобках
$route = preg_replace('/\{([\w\d-]+)\}/', '(?P<\1>[\w\d-]+)', $route);
//оформляем необходимые для регулярки элементы
$route = '/^' . $route . '$/';
$this->routes[] = ['route' => $route, 'controller' => $controller, 'action' => $action];
}
public function matchUri()
{
$uri = $_SERVER['QUERY_STRING'];
foreach ($this->routes as $route) {
if (preg_match($route['route'], $uri, $matches)) {
$this->params['controller'] = $route['controller'];
$this->params['action'] = $route['action'];
//цикл необходим, т.к. в массив совпаденией попадают элементы как и с цифровы индексом, так и с ассоциативным
foreach ($matches as $param => $value) {
if (is_string($param)) $this->params[$param] = $value; }
return $this->params;
}
}
}
}
PD9waHAKCi8qKgogKiBEZXNjcmlwdGlvbiBvZiBSb3V0ZXIKICoKICogQGF1dGhvciBob21lCiAqLwoKbmFtZXNwYWNlIENvcmU7CgpjbGFzcyBSb3V0ZXIKewoKICAgIHB1YmxpYyAkcm91dGVzID0gW107CiAgICBwdWJsaWMgJHBhcmFtcyA9IFtdOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRSb3V0ZShzdHJpbmcgJHJvdXRlLCBzdHJpbmcgJGNvbnRyb2xsZXIsIHN0cmluZyAkYWN0aW9uKQogICAgewogICAgICAgIC8v0Y3QutGA0LDQvdC40YDRg9C10Lwg0YHQu9C10YjQuCDQstC90YPRgtGA0LgKICAgICAgICAkcm91dGUgPSBwcmVnX3JlcGxhY2UoJy9cLy8nLCAnXFwvJywgJHJvdXRlKTsKICAgICAgICAKICAgICAgICAvL9Cy0YvRh9C70LXQvdGP0LXQvCDQv9Cw0YDQsNC80LXRgtGA0Ysg0LjQtyDRgdGC0YDQvtC60Lgg0LfQsNC/0YDQvtGB0LAg0LIg0YTQuNCz0YPRgNC90YvRhSDRgdC60L7QsdC60LDRhQogICAgICAgICRyb3V0ZSA9IHByZWdfcmVwbGFjZSgnL1x7KFtcd1xkLV0rKVx9LycsICcoP1A8XDE+W1x3XGQtXSspJywgJHJvdXRlKTsKCiAgICAgICAgLy/QvtGE0L7RgNC80LvRj9C10Lwg0L3QtdC+0LHRhdC+0LTQuNC80YvQtSDQtNC70Y8g0YDQtdCz0YPQu9GP0YDQutC4INGN0LvQtdC80LXQvdGC0YsKICAgICAgICAkcm91dGUgPSAnL14nIC4gJHJvdXRlIC4gJyQvJzsKCiAgICAgICAgJHRoaXMtPnJvdXRlc1tdID0gWydyb3V0ZScgPT4gJHJvdXRlLCAnY29udHJvbGxlcicgPT4gJGNvbnRyb2xsZXIsICdhY3Rpb24nID0+ICRhY3Rpb25dOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBtYXRjaFVyaSgpCiAgICB7CiAgICAgICAgJHVyaSA9ICRfU0VSVkVSWydRVUVSWV9TVFJJTkcnXTsKCiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPnJvdXRlcyBhcyAkcm91dGUpIHsKICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJHJvdXRlWydyb3V0ZSddLCAkdXJpLCAkbWF0Y2hlcykpIHsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJHRoaXMtPnBhcmFtc1snY29udHJvbGxlciddID0gJHJvdXRlWydjb250cm9sbGVyJ107CiAgICAgICAgICAgICAgICAkdGhpcy0+cGFyYW1zWydhY3Rpb24nXSA9ICRyb3V0ZVsnYWN0aW9uJ107CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8v0YbQuNC60Lsg0L3QtdC+0LHRhdC+0LTQuNC8LCDRgi7Qui4g0LIg0LzQsNGB0YHQuNCyINGB0L7QstC/0LDQtNC10L3QuNC10Lkg0L/QvtC/0LDQtNCw0Y7RgiDRjdC70LXQvNC10L3RgtGLINC60LDQuiDQuCDRgSDRhtC40YTRgNC+0LLRiyDQuNC90LTQtdC60YHQvtC8LCDRgtCw0Log0Lgg0YEg0LDRgdGB0L7RhtC40LDRgtC40LLQvdGL0LwKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRtYXRjaGVzIGFzICRwYXJhbSA9PiAkdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNfc3RyaW5nKCRwYXJhbSkpICR0aGlzLT5wYXJhbXNbJHBhcmFtXSA9ICR2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5wYXJhbXM7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cgp9Cg==