Using routes with use of external arguments

Iโ€™ve been playing around with routes today and want to share some things.

Goal

My goal here was to make page urls like tags/amounts/1000 to 1000.

Merge a collection of pages

First I needed to get all the pages for the route, merge 2 collections into 1.

$tag = new Pages();
$tag->add(page('tags/amounts')->children());
$tag->add(page('tags/topics')->children());

Create patterns

Then I wanted each slug to be a pattern.

  1. For the route to allow $uid to be used I needed to wrap the slugs into ().
  2. To know $id, I use that as key in the array. The route does not care about the key.
foreach($tag as $item) {
	$tags[$item->id()] = '(' . $item->slug() . ')';
}

The route

  1. As pattern I use $tags which is the array from above.
  2. I put use ($tags) to be able to use the $tags array inside the action.
  3. I get the key which is the page id which I use for site()->visit($key).
$kirby = kirby();
$kirby->set('route', [
    'pattern' => $tags,
    'action' => function($uid) use ($tags) {
        $key = array_search("($uid)", $tags);
        return site()->visit($key);
    }
]);

For me itโ€™s a different way to work with routes with a few new tricks. I hope someone finds it useful.