Routes
Introduction
A route defines how your application will handle what the user types into the URL and take the correct action from there.
All your application route configuration is stored in app/config/Routes.php
and handled by the Glowie\Core\Http\Rails
class.
Creating routes
You can create a new route in the route configuration file by using the static Rails::addRoute()
method. The URI (what the user types into the URL - relative to the application folder) must be the first parameter, and the remaining parameters will be:
controller
The full class name for the application controller that this route will instantiate. Must be an existing controller in app/controllers
.
The controller name must also include Glowie\Controllers
namespace. You can use ControllerName::class
to get this property properly (see examples below).
If no controller is specified, Glowie\Controllers\Main
will be used by default.
action The action that this route will instantiate. Must be a valid action from the specified controller.
If no action is specified, a camelCase version of the route name will be used.
Note: If the specified controller
or action
is not found, Glowie will trigger an error.
methods
The HTTP request methods that this route accepts. Can be a single method or an array of allowed methods (get
, post
, put
, patch
or delete
). If the route is requested with a method other than the specified ones, Glowie will return a 405 Method Not Allowed error response.
If no method is specified, all methods will be accepted by default.
name This is the name used to retrieve this route from your application. If no name is specified, a kebab-case version of the route URI will be used.
Example
use Glowie\Controllers\Main;
use Glowie\Controllers\Blog;
# myappurl.com
Rails::addRoute('/', Main::class, 'index');
# myappurl.com/blog
Rails::addRoute('blog', Blog::class, 'index');
# myappurl.com/blog/new (only POST or PUT methods)
Rails::addRoute('blog/new', Blog::class, 'new', ['post', 'put'], 'blog-new');
Note: routes are parsed from first to last order, so the first matching route will be triggered.
Important! Route URIs and names are case-sensitive. This means route blog
and Blog
will be matched differently.
Using dynamic route parameters
If your route needs to get a dynamic parameter within a friendly URL (like an ID, name, slug, etc.) you can bind this parameter into the route by using :parameter_name
.
This means the route will accept any value (except slashes) in this segment.
Example
use Glowie\Controllers\Blog;
use Glowie\Controllers\Products;
# myappurl.com/blog/(post id)
Rails::addRoute('blog/:id', Blog::class, 'index');
# myappurl.com/products/(category name)/(product id)
Rails::addRoute('products/:category/:id', Products::class, 'category');
You can retrieve this parameters from the controller or middleware by using $this->params->param_name
.
Example
$category = $this->params->category; # returns the category name typed in the URL
$id = $this->params->id; # returns the ID typed in the URL
Optional route parameters
Currently, Glowie does not support optional route parameters natively, but there is a small workaround to work with this kind of route.
If you want to use an optional route parameter, create a new route for each of them, being sure to order your routes from the most specific one to the less specific one.
Example
use Glowie\Controllers\Search;
// All parameters were filled
Rails::addRoute('search/:query/:page', Search::class, 'search');
// Only "query" parameter was filled
Rails::addRoute('search/:query', Search::class, 'search');
// No parameters were filled
Rails::addRoute('search', Search::class, 'search');
Redirecting routes
If you just want to simply redirect a route to an URL, you don't need to write a controller for that. You can simply use Rails::addRedirect()
method. The first parameter is the URI, and the remaining parameters are:
target The target URL to redirect to.
code The HTTP status code to send with the redirect (defaults to 307 Temporary Redirect).
methods
An single or an array of allowed HTTP request methods that will trigger this route. Same as in Rails::addRoute()
methods setting (see above).
name
The route internal identifier. Same as in Rails::addRoute()
methods setting (see above).
Example
# myappurl.com/blog
Rails::addRedirect('blog', 'https://myappblog.wordpress.com');
Mapping multiple routes
If you want to map multiple routes to a method at once, use the Rails::mapRoutes()
method. It must receive an associative array as the first parameter, with the key being the route URI, and the value an array with the route controller, action and name. The second parameter is a single method or array of accepted methods.
Example
use Glowie\Controllers\Blog;
Rails::mapRoutes([
'blog/new' => [Blog::class, 'new', 'blog-new'],
'blog/edit' => [Blog::class, 'edit', 'blog-edit'],
'blog/delete' => [Blog::class, 'delete', 'blog-delete']
], ['post', 'put']);
Auto routing
Glowie has the capability of parsing routes automatically if no route for the requested URI was specified.
Auto routing comes disabled by default. In order to enable it, in the route configuration file use:
Rails::setAutoRouting(true);
In auto routing the routes will be parsed in the following way: [controller]/[action]/[parameters...]
. Controller and action names will be resolved converting the URI to PascalCase (controller) and camelCase (action) versions.
Example: products-list-test
will be resolved to ProductsListTest
.
If no controller is specified, Glowie\Controllers\Main
will be used by default.
If no action is specified, index
will be used by default.
Example
-
User types in
myappurl.com
. Glowie will callMain
controller withindex()
action. -
User types in
myappurl.com/about
. Glowie will callAbout
controller withindex()
action. -
User types in
myappurl.com/about/contact
. Glowie will callAbout
controller withcontact()
action. -
User types in
myappurl.com/products/list-products/123/abc
. Glowie will callProducts
controller withlistProducts()
action and the remaining parameters will be stored inside$this->params
as an URI segment (split by each slash).
echo $this->params->param1; # returns 123
echo $this->params->param2; # returns abc
If a corresponding controller or action is not found, Glowie will return a 404 Not Found error response.