-
-
Notifications
You must be signed in to change notification settings - Fork 1
Router
You may need to import this feature on top of your code.
use Scarlets\Route;
use Scarlets\Route\Serve;All router should be placed on /routes/ folder
The router priority is:
- status.php (HTTP status)
- api.php (API Router)
- web.php (Web Router)
Redirect user to https protocol
Route::forceSecure();This feature will help you to define returned data when any HTTP status was happened.
Route::status($code, $callable);
# Example
Route::status(404, function(){
Serve::raw("404 Not Found");
});
Route::status(503, function(){
# return true; // This will allow user to bypass maintenance message
Serve::raw("System Maintenance");
});When you're using the router, you can define your match pattern.
The match are started with the index parameter
And followed by:
-
:(Regex Pattern) -
?(Optional Pattern)
So it would be like:
/user/{0}/home-
/quiz/{0?}<- optional pattern -
/name/{0:[A-Za-z]+}<- regex pattern
The zero 0 means it should be passed to the first parameter of callable function..
Or you could also match all path like below
Route::get('/user/{*}', function($all){
/* ... */
});The available route in this library is
- get
- post
- delete
- put
- options
- match (custom method)
- any (This route match any method)
Route::get($url, $callable, $middleware = false);
# Example
# The parameter index for example below is `0` and the regex `[A-Za-z]+`
Route::get('/text/{0:[A-Za-z]+}', function($text = ['world']){
// Serve::raw("Hello, $text[0]");
return "Hello, $text[0]";
});You could also routing with your own HTTP method.
Route::method($method, $url, $callable, $middleware = false);When you have deep namespace for your project
you can use this feature to simplify the usage.
Having nested function with other routing feature is also allowed.
Route::namespaces('App\Http\Controllers', function(){
// Inside this scope the namespace is "App\Http\Controllers"
// Call 'route' function on "User\Home" Class
Route::get('/user/{0}', 'User\Home::route');
});Define URL prefix for every router inside the function scope.
Route::prefix('admin', function(){
Route::get('users', function(){
// Matches The "/admin/users" URL
Serve::raw("Hi admin!");
// Or route to User List
Route::route('list.users');
});
});Route::domain('{0}.framework.test', function($domain){
Route::get('/home/{0}', function($query){
// Will be available on "*.framework.test" domain
});
});This will be useful if you have a block of route.
Maybe like routes for logged in user or limited page request.
Route::middleware('limit:2,60', function(){
Route::get('limit', function(){
Serve::raw("Limited request");
});
});You could also set the middleware from request method's router
Route::get('/limited/page', function(){
Serve::raw("Limited request");
}, 'limit:2,60');It's better if you define the Middleware in /app/Middleware.php. Instead of manually adding like below. The code below is just an example.
Route\Middleware::$register['limit'] = function($request = 2, $seconds = 30){
$total = Cache::get('request.limit', 0);
if($total < $request){
// Set expiration when it's the first request only ($total == 0)
$expire = $total === 0 ? $seconds : 0;
// Put the request count on cache
Cache::set('request.limit', $total + 1, $expire);
// Continue request
return false;
}
// Block request
else{
Serve::status(404);
return true;
}
};