vulcanphp / phprouter
PHP Router is a powerful, secure, simple, and quick routing system for PHP Application or REST APIs
V1.1.0
2024-03-04 08:17 UTC
Requires
- php: >=7.4
- vulcanphp/inputmaster: ^1.0
README
PHP Router is a powerful, secure, simple, and quick routing system for PHP Application or REST APIs
Installation
It's recommended that you use Composer to install PHP Router
$ composer require vulcanphp/phprouter
Basic Usage
After Installing PHP Router initialize it in your application then you can simply use it allover on your application
<?php use VulcanPhp\PhpRouter\Router; use VulcanPhp\PhpRouter\Route; use VulcanPhp\InputMaster\Request; require_once __DIR__ . '/vendor/autoload.php'; // initialize PHP Router $router = Router::init(new Request()); // set default middleware to router $router->setMiddlewares([Csrf::class]); /** * methods: get, post, put, patch, delete, options * all are available for both static or non-static */ // add a route with closure callback $router->get('/', function(){ echo 'Welcome to PHP Router'; }); // add route statically with array callback class Route::get('/user', [User::class, 'index']); // add a route for both get or post http request Route::form('/user/create', [User::class, 'create']); // add a route for any http request Route::any('/user/find', [User::class, 'find']); // add a route with defining a $id parameter Route::get('/user/{id}', function($id){ var_dump($id); }); // add route with matched http request Route::match(['post', 'options'], '/user/ajax', [User::class, 'ajax']); // add a resource route for book Route::resource('book', Book::class); // add a redirect route with http code: 301 Route::redirect('/here', '/there', 301); // if your application has a view() function for vulcanphp/sweet-view then you can simply add a view route Route::view('/docs', 'docs'); // add a route with a specific regex Route::regex('%^/(.+)$%', 'get', fn($slug) => var_dump($slug)); // set a fallback to this router $router->setFallback(function() { echo 'Page Does not Found'; exit; }); // resolve current router echo $router->resolve(); // ...
Use With Grouped Routes
<?php use VulcanPhp\PhpRouter\Route; // add a simple router group Route::group(['prefix' => 'user'], function(){ // assign routes in this group Route::get('/create', '{callback}'); // add route Route::get('/show/{id}', function($id){ var_dump($id); }); }); // include routes from external file Route::group( ['prefix' => 'api/v1', 'middlewares' => [Cros::class, JWTGuard::class]], // it will fetch all the routes from api.php and assign to this group __DIR__ . '/routes/api.php', ); // use nested groups Route::group(['prefix' => 'admin'], function(){ Route::get('/', [Dashboard::class, 'index']); // create a new group under parent group Route::group(['prefix' => 'user'], function(){ Route::get('/', [User::class, 'index']); Route::get('/create', [User::class, 'create']); Route::get('/{id}/edit/', [User::class, 'end']); }); // add a resource route under this group Route::resource('book', Book::class); }); // ...
PHP Router Advanced Usage
<?php use VulcanPhp\PhpRouter\Router; use VulcanPhp\PhpRouter\Route; use VulcanPhp\InputMaster\Request; use VulcanPhp\InputMaster\Response; use VulcanPhp\InputMaster\Input\InputHandler; /** * usage of reflection parameters * available: Request, Response, InputHandler, Url, IRoute */ Route::form('/login', function(Request $request, InputHandler $input, Response $response) { if($request->isPostBack()){ if($input->exists(['username', 'password'])){ var_dump($input->all()); }else{ return $response->back(); } } echo 'hello from login'; }) ->name('login') ->middleware(LoginGuard::class); // add a new reflection parameter Router::$instance->setFilters( Router::FILTER['reflection_parameters'], function($parameters){ $parameters[] = [ 'parameter' => BaseModel::class, 'callback' => function($param, $params, $key, $value) { return $param->getType()->getName()::findOrFail([ $param->getType()->getName()::primaryKey() => $value ]); } ]; return $parameters; } ); // usage of custom reflection parameter Route::get('/user/{id}', function(User $user){ var_dump($user); }); // ...
Example Middleware
<?php namespace MyApp\Middlewares; use VulcanPhp\InputMaster\Request; use VulcanPhp\InputMaster\Response; use VulcanPhp\PhpRouter\Security\Interfaces\IMiddleware; class MyMiddleware implements IMiddleware { public function handle(Request $request, Response $response): void { // do whatever .. } }
Example Csrf Verified
<?php namespace MyApp\Middlewares; use VulcanPhp\PhpRouter\Security\BaseCsrfVerifier as IMiddleware; use VulcanPhp\PhpRouter\Security\Token\SessionTokenProvider as TokenProvider; class Csrf extends IMiddleware { /** * CSRF validation will be ignored on the following urls. */ protected $except = ['/api/*']; public function __construct() { $this->setTokenProvider(new TokenProvider); } }
Example Resource Controller
<?php namespace MyApp\Controller; use VulcanPhp\InputMaster\Request; use VulcanPhp\InputMaster\Response; use VulcanPhp\PhpRouter\Routing\Interfaces\IResource; class MyResourceController implements IResource { public Request $request; public Response $response; public function __construct(Request $request, Response $response) { $this->request = $request; $this->response = $response; } public function index() { // code .. } public function show($id) { // code .. } public function store() { // code .. } public function create() { // code .. } public function edit($id) { // code .. } public function update($id) { // code .. } public function destroy($id) { // code .. } }