phprtc / http-router
PHPRTC Http Router
dev-master
2022-02-13 21:23 UTC
Requires
- php: >=8.1
- nikic/fast-route: ^1.3
- opis/closure: ^3.6
- phprtc/contracts: dev-master
Requires (Dev)
- phpstan/phpstan: ^1.4
- phpunit/phpunit: ^9.5
- symfony/var-dumper: ^6.0
This package is auto-updated.
Last update: 2024-09-24 21:00:33 UTC
README
在FastRoute(https://github.com/nikic/FastRoute)之上构建的优雅HTTP路由器,以提供更简单的使用方式。
升级指南
查看 变更日志 文件
安装
composer require phprtc/http-router
使用方法
简单示例
use RTC\Http\Router\Route; use RTC\Http\Router\Dispatcher; require('vendor/autoload.php'); Route::get('/', function () { echo 'Hello world'; }); $method = $_SERVER['REQUEST_METHOD']; $path = $_SERVER['REQUEST_URI']; //create route dispatcher $dispatcher = Dispatcher::collectRoutes() ->dispatch($method, $path); //determine dispatch result switch (true) { case $dispatcher->isFound(): $controller = $dispatcher->getRoute()->getController(); $controller($dispatcher->getUrlParameters()); break; case $dispatcher->isNotFound(): echo "Page not found"; break; case $dispatcher->isMethodNotAllowed(): echo "Request method not allowed"; break; }
类似于控制器的示例
use RTC\Http\Router\Route; Route::get('/home', 'MainController@home');
高级使用
use RTC\Http\Router\Route; Route::prefix('user')->name('user.') ->namespace('User') ->middleware('UserMiddleware') ->group(function (){ Route::get('profile', 'UserController@profile'); Route::put('update', 'UserController@update'); });
更多高级使用
use RTC\Http\Router\Route; Route::prefix('user') ->prepend('api') ->append('{token}') ->middleware('UserMiddleware') ->group(function (){ Route::get('profile', 'UserController@profile'); Route::put('update', 'UserController@update'); }); // => /api/user/{token}
定义路由参数类型
use RTC\Http\Router\Route; // id => must be number Route::get('users/{id}', 'Controller@index')->whereNumber('id'); // name => must be alphabetic Route::get('users/{name}', 'Controller@profile')->whereAlpha('name'); // username => must be alphanumeric Route::get('users/{username}', 'Controller@profile')->whereAlphaNumeric('username'); // Manually provide regular expression pattern to match parameter with Route::get('/users/{id}', 'a')->where('id', '[0-9]+'); Route::get('/users/{user}/posts/{post}', 'Ctrl@method')->where([ 'user' => '[a-zA-Z]+', 'post' => '[0-9]+' ]);
路由字段
字段有助于为路由或路由组添加更多描述。
use RTC\Http\Router\Route; Route::prefix('user') ->middleware('User') ->addField('specie', 'human') ->group(function (){ Route::get('type', 'admin')->addField('permissions', 'all'); Route::get('g', fn() => print('Hello world')); });
Route::match()
use RTC\Http\Router\Route; use RTC\Http\Router\Collector; use RTC\Http\Router\Dispatcher; require 'vendor/autoload.php'; $controller = fn() => print time(); Route::match(['get', 'post'], '/user', $controller) ->middleware('auth') ->namespace('App') ->name('home'); $collector = Collector::create()->collect(); $dispatchResult = Dispatcher::create($collector) ->dispatch('get', '/user/hello'); var_export($dispatchResult->getRoute());
带命名路由的 Route::match()
use RTC\Http\Router\Route; Route::match(['get', 'post'], 'login', 'AuthController@login')->name('login.'); //Will generate below routes Route::get('login', 'AuthController@login')->name('login.get'); Route::post('login', 'AuthController@login')->name('login.post');
Route::any()
use RTC\Http\Router\Route; use RTC\Http\Router\Collector; use RTC\Http\Router\Dispatcher; $controller = fn() => print time(); Route::any(['/login', '/admin/login'], 'get', $controller); $collector = Collector::create()->collect(); $dispatchResult1 = Dispatcher::create($collector) ->dispatch('get', '/login'); $dispatchResult2 = Dispatcher::create($collector) ->dispatch('get', '/admin/login');
Route::matchAny()
use RTC\Http\Router\Route; Route::matchAny( ['get', 'post'], ['/customer/login', '/admin/login'], 'MainController@index' ); //Which is equivalent to: Route::get('/customer/login', 'MainController@index'); Route::post('/customer/login', 'MainController@index'); Route::get('/admin/login', 'MainController@index'); Route::post('/admin/login', 'MainController@index');
Route::resource()
use RTC\Http\Router\Route; Route::resource('photos', 'App\Http\Controller\PhotoController');
Crud::create()
use RTC\Http\Router\Crud; Crud::create('/', 'Controller')->go();
上面的代码将生成以下路由
为什么不使用 Route::resource()?
Crud 创建器生成 6 条路由,其中一条路由会删除端点中的所有记录。
使用 Crud 创建器,您可以选择创建或删除哪些路由。
use RTC\Http\Router\Crud; //Disabling route creation Crud::create('/', 'Controller') ->disableIndexRoute() ->disableStoreRoute() ->disableDestroyAllRoute() ->disableShowRoute() ->disableUpdateRoute() ->disableDestroyRoute() ->go(); //Specifying custom route parameter name Crud::create('/', 'Controller')->parameter('userId'); //Specify parameter type Crud::create('/', 'Controller')->numericParameter(); Crud::create('/', 'Controller')->alphabeticParameter(); Crud::create('/', 'Controller')->alphaNumericParameter();
将路由作为配置
//routes.php use RTC\Http\Router\Route; Route::get('/', 'MainController@index'); Route::get('/help', 'MainController@help'); //server.php use RTC\Http\Router\Collector; $collector = Collector::create() ->collectFile('routes.php') ->register(); $routes = $collector->getCollectedRoutes();
缓存
缓存路由,以便它们不需要每次都收集。
use RTC\Http\Router\Collector; $collector = Collector::create() ->collectFile('routes.php') ->cache('path/to/save/cache.php', false) ->register(); $routes = $collector->getCollectedRoutes();
使用闭包缓存路由
use RTC\Http\Router\Route; use RTC\Http\Router\Collector; Route::get('/', function (){ echo uniqid(); }); $collector = Collector::create() ->collect() ->cache('path/to/save/cache.php', true) ->register(); $routes = $collector->getCollectedRoutes();
注意,您必须指定您的路由包含闭包
传递默认数据
您可以替代地传递数据以添加到所有路由之前。
在设置/更新默认路由数据后,必须手动清除缓存的路线。
use RTC\Http\Router\Collector; $collector = Collector::create(); $collector->collectFile('api-routes.php', [ 'prefix' => 'api', 'name' => 'api.', 'namespace' => 'Api\\' ]); $collector->register();
更改分隔符
对于Web上下文之外的使用,提供了一个函数来更改默认分隔符 "/"。
use RTC\Http\Router\Route; use RTC\Http\Router\Collector; use RTC\Http\Router\Dispatcher; require 'vendor/autoload.php'; Route::prefix('hello') ->group(function () { Route::get('world', fn() => print('Hello World')); }); $collector = Collector::create() ->prefixDelimiter('.') ->collect() ->register(); $dispatchResult = Dispatcher::create($collector) ->dispatch('get', 'hello.world'); var_export($dispatchResult);
查找路由和生成路由URI
use RTC\Http\Router\Route; use RTC\Http\Router\Collector; Route::get('/users', 'Controller@method')->name('users.index'); $collector = Collector::create()->collect(); echo $collector->uri('users.index'); // => /users $collector->route('users.index'); // => Instance of RTC\Http\Router\Route\RouteData
注意
- 当同时使用 Collector::collect() 和 Collector::collectFile() 时,必须小心,因为 collectFile 方法将在开始收集之前清除先前收集的路由。
确保在调用 Collector::collectFile() 之前先调用 Collector::collect()。
许可证
路由HTTP动词图像归 Riptutorial 所有.
QuickRoute 是 MIT 许可。