forked from noahbuscher/Macaw, (*1)
Route
Route is a simple, open source PHP router. It's super small (~150 LOC), fast, and has some great annotated source code. This class allows you to just throw it into your project and start using it immediately., (*2)
Install
Composer
If you have Composer, (*3)
# composer require alsemany/route
Download From Releases
https://github.com/alsemany/route/releases
Download Zip file or tar.gz, (*4)
Examples
First, use
the Route namespace:, (*5)
use \Alsemany\Route\Route;
Route is not an object, so you can just make direct operations to the class. Here's the Hello World:, (*6)
Route::get('/', function() {
echo 'Hello world!';
});
Route::dispatch();
Route also supports lambda URIs, such as:, (*7)
Route::get('/(:any)', function($slug) {
echo 'The slug is: ' . $slug;
});
Route::dispatch();
You can also make requests for HTTP methods in Route, so you could also do:, (*8)
Route::get('/', function() {
echo 'I'm a GET request!';
});
Route::post('/', function() {
echo 'I'm a POST request!';
});
Route::any('/', function() {
echo 'I can be both a GET and a POST request!';
});
Route::dispatch();
Lastly, if there is no route defined for a certain location, you can make Route run a custom callback, like:, (*9)
Route::catchall(function() {
echo 'Catching All 404 Errors :: Not Found';
});
If you don't specify an error callback, Route will just echo 404
., (*10)
In order to let the server know the URI does not point to a real file, you may need to use one of the example configuration files., (*11)
Example passing to a controller instead of a closure
It's possible to pass the namespace path to a controller instead of the closure:, (*12)
For this demo lets say I have a folder called controllers with a demo.php, (*13)
index.php:, (*14)
require('vendor/autoload.php');
use Alsemany\Route\Route;
Route::get('/', 'Controllers\demo@index');
Route::get('page', 'Controllers\demo@page');
Route::get('view/(:num)', 'Controllers\demo@view');
Route::dispatch();
demo.php:, (*15)
<?php
namespace controllers;
class Demo {
public function index()
{
echo 'home';
}
public function page()
{
echo 'page';
}
public function view($id)
{
echo $id;
}
}
This is with Route installed via composer., (*16)
composer.json:, (*17)
{
"require": {
"alsemany/Route": "^0.1.0"
},
"autoload": {
"psr-4": {
"" : ""
}
}
}
````
.htaccess(Apache):
RewriteEngine On
RewriteBase /, (*18)
Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d, (*19)
RewriteRule ^(.*)$ index.php?$1 [QSA,L], (*20)
.htaccess(Nginx):
rewrite ^/(.*)/$ /$1 redirect;, (*21)
if (!-e $request_filename){
rewrite ^(.*)$ /index.php break;
}, (*22)
```, (*23)