Routing

Starting the router

$router = new Router();

Registering routes

Registering a single route

$router->register('api/users/(:any)', array(
  'method' => 'GET',
  'action' => function($username) {
    // the router action code
  }
));

Registering multiple routes

$router->register(array(
  array(
    'pattern' => 'api/users/(:any)',
    'method'  => 'GET',
    'action'  => function($username) {
      // the router action code
    }
  ),
  array(
    'pattern' => 'api/users/(:any)',
    'method'  => 'DELETE',
    'action'  => function($username) {
      // the router action code
    }
  )
));

Registering a route for multiple request methods

$router->register('api/users/(:any)', array(
  'method' => 'GET|POST|DELETE',
  'action' => function($username) {
    // the router action code
  }
));

Registering a route for all incoming requests

$router->register('api/users/(:any)', array(
  'method' => 'ALL',
  'action' => function($username) {
    // the router action code
  }
));

2.4.0 +

Restricting a route to a specific host

$router->register('api/users/(:any)', array(
  'method' => 'GET',
  'host'   => 'getkirby.com',
  'action' => function($username) {
    // the router action code
  }
));

Available placeholders

URL patterns for routes can be static, relative URLs: some/static/url or parts of the URL can be defined by dynamic placholders:

Placeholder Matches
(:any) Matches any character and stops at the next /
(:num) Matches any number and stops at the next /
(:all) Matches everything from here on until the end or the next placeholder

Placeholders can also contain expressions. I.e. ([a-z]+)
Placeholders will be passed as arguments in the order they appear.

// my/awesome/pattern/(:any)/(:num)/(:all)
function($anyPlaceholder, $numPlaceholder, $allPlaceholder) {

};

Optional placeholders

Optional attributes can be defined by adding a question mark to the placeholder:

- (:any?)
- (:num?)
- (:all?)

Creating routing filters

Routing filters are run before the route function. They can be used to check for user authentication/authorization or they can check if a route is applicable for the current environment.

Registering routing filters globally

You can register routing filters globally to use them in many of your routes at once:

$router->filter('auth', function($route) {
  // some authentication checks
  // $route is the route array
});

Applying a global filter to a route

$router->register('api/users/(:any)', array(
  'method' => 'ALL',
  'filter' => 'auth',
  'action' => function($username) {
    // the router action code
  }
));

Applying multiple global filters to a route

$router->register('api/users/(:any)', array(
  'method' => 'ALL',
  'filter' => 'auth|someotherfilter',
  'action' => function($username) {
    // the router action code
  }
));

You can also use this syntax:

$router->register('api/users/(:any)', array(
  'method' => 'ALL',
  'filter' => ['auth', 'someotherfilter'],
  'action' => function($username) {
    // the router action code
  }
));

2.5.3 +

Using a routing filter for just one route

You can also pass an anonymous function to a route directly if the filter is supposed to be applied to only that route:

$router->register('api/users/(:any)', array(
  'method' => 'ALL',
  'filter' => function($route) {
    // some checks
    // $route is the route array
  },
  'action' => function($username) {
    // the router action code
  }
));

Skipping routes from a routing filter

A routing filter can return false. This will tell the router to skip the route and try the next matching one.

Run the router

if($route = $router->run()) {
  $response = call($route->action(), $route->arguments());
}