Routing
FEAST contains three different methods for controlling routing. One is static, the other two are dynamic.
Automatic default routing
When a new Controller/Action pair is made with the php famine feast:create:action
command, a default route is made. In addition, unless noview true is passed in, a View file is created as well.
The Controller and action by default become the URL. For example,
AboutController->privacyGet will have a default url of /about/privacy for get requests. No user action is required
to create this routing.
A special case exists for the index actions. If indexGet exists in
AboutController, then /about will route to the indexGet
(or post etc based on request type) method.
Dynamic routing
There are two methods of dynamic routing, both of which use similar path strings for urls. The url path can contain
substituted variables by adding in :variableName. Variables are considered dynamic properties. The final property can
be marked as optional by preceding the : with a ?. This allows a route that can optionally omit the last section.
Examples:
/user/:username/:password would be matched by /user/jeremy/feast and would NOT be matched by /user/jeremy
/user/:username/password/:password would be matched by /user/jeremy/password/feast and would NOT be matched
by /user/jeremy/password
/user/:username/?:password would be matched by both /user/jeremy/feast and /user/jeremy
Dynamic Routing via Attributes - Recommended
FEAST makes use of the Attributes
feature of PHP 8.0 for custom route generation. Similar to annotations in docblocks in older versions of PHP, Attributes
allow for a "comment" that can be evaluated by reflection. See \Feast\Attributes\Path for the attribute and below for
an example:
<?php
class RegisterController
{
#[Path(path:'register/:key/:registrationType', name:'freereg',method: Path::METHOD_GET|Path::METHOD_POST)]
public function indexGet(string $key, string $registrationType): voidThis creates a route at /register/$key/$registrationType for GET and POST requests to use the indexGet method of the RegisterController.
Dynamic routing via method call - Not recommended
While using the default routing or the Attribute based routing is recommended, you can also call
Feast\Router\Router::addRoute directly in bootstrap.php to create a route. This allows for easily finding your
configured routes, but is a more verbose syntax. The parameters to addRoute are as follows (with a sample call below)
public function addRoute(
string $path, // The url path for the route
string $controller, // The name of the controller class to call (as string not class string)
string $action, // The name of the action method to call
?string $routeName = null, // An optional route name for easy use with
// redirect and forward (documented elsewhere).
array $defaults = null, // an array of default values for the method call if any
string $httpMethod = 'GET', // The HTTP verb (can only specify one)
string $module = 'Default' // The Module to use. Modules documented elsewhere.
): void;
$router->addRoute('/im-a-teapot/:user/:pass', 'Teapot', 'shortAndStout', null, ['test' => 'testing']);
// The above will create a dynamic url at /im-a-teapot/{user}/{password} that will call TeapotController::shortAndStout
// with the expected parameters of $user, $pass, and $test Caching routes
To speed up your requests, you may cache your router configuration by running php famine feast:cache:router-generate.
To clear the cache, run php famine feast:cache:router-clear.
If you cache your routes, changes will NOT take effect unless you clear or regenerate.
Powered by FEAST Framework
See this project at https://github.com/feastframework/documentation