Есть роуты:
# LetterController
'letter' => [
'controller' => 'letter',
'action' => 'index',
],
# пагинация для страницы /letter/ (вид: /letter/index/2/)
'letter/index/{page:\d+}' => [
'controller' => 'letter',
'action' => 'index',
],
'letter/{page:[а-яё]{1,2}}' => [
'controller' => 'letter',
'action' => 'detail',
],
# как сделать обработку подобного роута для пагинации на детальной странице (функции см. ниже)?
'letter/{page:[а-яё]{1,2}}/detail/{page:\d+}' => [
'controller' => 'letter',
'action' => 'detail',
],
Функции для обработки:
public function add($route, $params) {
# на данный момент не совсем корректно работает замена, поэтому match() возвращает false
$route = preg_replace('/{([a-z]+):(.+)}/ui', '(?P<\1>\2)', $route);
$route = '#^'.$route.'$#u';
$this->routes[$route] = $params;
}
public function match() {
$url = urldecode(html_entity_decode(trim($_SERVER['REQUEST_URI'], '/')));
foreach ($this->routes as $route => $params) {
echo $route . ' - ' . $url . '<br/>';
// #^letter/(?P[а-яё]{1,2}}/detail/{page:\d+)$#u - letter/а/detail/2
// рабочий пример замены в функции add():
// #^letter/index/(?P\d+)$#u - letter/index/2
if (preg_match($route, $url, $matches) === 1) {
foreach ($matches as $key => $match) {
if (is_string($key)) {
if (is_numeric($match)) {
$match = (int) $match;
}
$params[$key] = $match;
}
}
$this->params = $params;
return true;
}
}
return false;
}