A friend of mine recently asked how to do default route arguments and route specific configuration in Slim, so I thought I'd write up how to do it.
Consider a simple Hello route:
$app->get("/hello[/{name}]", function ($request, $response, $args) {
$name = $request->getAttribute('name');
return $response->write("Hello $name");
})
This will display "Hello " for the URL /hello and "Hello Rob" for the URL /hello/Rob.
If we wanted a default of "World", we can set an argument on the Route object that is returned from get() (and all the other routing methods):
$app->get("/hello[/{name}]", function ($request, $response, $args) {
$name = $request->getAttribute('name');
return $response->write("Hello $name");
})->setArgument('name', 'World');
This works exactly as you would expect.
The route arguments don't have to be placeholder and you can set multiple route arguments. For example:
$app->get("/hello[/{name}]", function ($request, $response, $args) {
$name = $request->getAttribute('name');
$foo = $request->getAttribute('foo');
return $response->write("Hello $name, foo = $foo");
})->setArguments([
'name' => 'World,
'foo' => 'bar',
]);
Now, we have a foo attribute in our request, which is a per-route configuration option that you can do with as you wish – e.g. setting acl rules like this:
$app->get("/users", App\HelloAction::class)->setArgument("role", "userAdministrator");