именно так, через use.
для больших систем можно использовать готовый продвинутый DI, будет выглядеть примерно так
$router->on("/catalog.(.+?)$/", function (Match $match, Options $opts, Pager $page) {
// ...
});
или попроще, через service locator, можно написать самому
$app->set('pager', new Pager(...));
$router->on("/catalog.(.+?)$/", function (match, opts) use ($app) {
// ...
$app->get('pager')->render(...);
});
и немного разберу исходный код
$router->on("/catalog.(.+?)$/", function ($match, $opts) use (&$page ) { // нет смысла передавать по ссылке &
// базовый title, в данном случае "catalog", лучше задать где-то на уровень выше, или, по крайней мере, не хардкодить разделитель |
$page->assign(['title' => 'catalog | '.$match]);
// вызывать echo прямо тут - плохой вариант, лучше добавить уровень абстракции, и выводить в браузер результат return или как-то еще
echo $page->render()
});