Можно ли манипулировать массивом аргументов в beforeRoute () для обработчика маршрута? - PullRequest
0 голосов
/ 31 марта 2019

У меня есть случай, когда элемент пути шаблона может интерпретироваться по-разному. Это все допустимые пути:

/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, но безрезультатно.

...