У меня есть случай, когда элемент пути шаблона может интерпретироваться по-разному. Это все допустимые пути:
/items // 1) all items, page 1
/items/2 // 2) all items, page 2, 3, 4, etc.
/items/2018 // 3) all items published in '2018', page 1
/items/2018/2 // 4) all items published in '2018', page 2, 3, 4, etc.
/items/name // 5) all items published by 'name', page 1
/items/name/2 // 6) all items published by 'name', page 2, 3, 4, etc.
А это маршруты:
[maps]
/items = ItemsController // covers 1)
/items/@filterOrOffset = ItemsController // covers 2), 3), 5)
/items/@filter/@offset = ItemsController // covers 4), 6)
Поскольку F3 не разрешает использование RegEx в шаблонах маршрутов, для интерпретации я использую событие beforeRoute . Класс BaseController выглядит следующим образом:
class BaseController {
public function beforeRoute($f3, array $arguments) {
// – interpret $arguments, which might be @filterOrOffset or @filter & @offset
// and set $arguments['year'], $arguments['name'] and $arguments['offset'],
// – then unset $arguments['filter'] or $arguments['filterOrOffset'],
// – then call the route handler like this:
$method = strtolower($f3->VERB);
$this->{$method}($f3, $arguments);
return false;
}
}
Так все работает нормально, но мне как-то не нравится, что я вызываю обработчик маршрута вручную. Я бы предпочел, чтобы инфраструктура вызывала обработчик маршрута (удаляя последние три строки), но я не знаю, как передать массив манипулируемых аргументов. Я попробовал это, установив $ f3-> PARAMS, но безрезультатно.