ahmard / quick-route
一款简单易用的http路由器,设计得与Laravel路由器非常相似
3.9.0
2022-02-11 00:33 UTC
Requires
- php: >=7.4
- ext-json: *
- nikic/fast-route: ^1.3
- opis/closure: ^3.6
Requires (Dev)
- phpstan/phpstan: ^1.4
- phpunit/phpunit: ^9.5
- symfony/var-dumper: ^6.0
- dev-master
- 3.9.0
- v3.8.x-dev
- 3.8.3
- 3.8.2
- 3.8.1
- 3.8.0
- v3.7.x-dev
- 3.7.3
- 3.7.2
- 3.7.1
- 3.7.0
- v3.6.x-dev
- 3.6.0
- v3.5.x-dev
- 3.5.3
- 3.5.2
- 3.5.1
- 3.5.0
- v3.4.x-dev
- 3.4.1
- 3.4.0
- v3.3.x-dev
- 3.3.1
- 3.3.0
- v3.2.x-dev
- 3.2.3
- 3.2.2
- 3.2.1
- 3.2.0
- v3.1.x-dev
- 3.1.1
- 3.1.0
- 3.0.0
- 2.5.6
- 2.5.5
- 2.5.4
- 2.5.3
- 2.5.2
- 2.5.1
- 2.5.0
- 2.4.0
- 2.3.0
- 2.2.1
- 2.2.0
- 2.1.5
- 2.1.4
- 2.1.3
- 2.1.2
- 2.1.1
- 2.1.0
- 2.0.0
- 1.0.2
- 1.0.1
- 1.0.0
- dev-upgrade-middleware-collector
- dev-theroute-params-rename
This package is auto-updated.
Last update: 2024-09-11 06:11:38 UTC
README
基于FastRoute构建的优雅http路由器,提供更便捷的使用体验。
升级指南
查看变更日志文件
安装
composer require ahmard/quick-route
使用方法
简单示例
use QuickRoute\Route; use QuickRoute\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 QuickRoute\Route; Route::get('/home', 'MainController@home');
高级使用
use QuickRoute\Route; Route::prefix('user')->name('user.') ->namespace('User') ->middleware('UserMiddleware') ->group(function (){ Route::get('profile', 'UserController@profile'); Route::put('update', 'UserController@update'); });
更高级的使用
use QuickRoute\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 QuickRoute\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 QuickRoute\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 QuickRoute\Route; use QuickRoute\Router\Collector; use QuickRoute\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 QuickRoute\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 QuickRoute\Route; use QuickRoute\Router\Collector; use QuickRoute\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 QuickRoute\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 QuickRoute\Route; Route::resource('photos', 'App\Http\Controller\PhotoController');
Crud::create()
use QuickRoute\Crud; Crud::create('/', 'Controller')->go();
上面的代码将生成以下路由
为什么不使用Route::resource()?
Crud生成器会生成6条路由,其中一条路由会删除端点的所有记录。
使用Crud生成器,您可以选择创建或不再创建哪些路由。
use QuickRoute\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 QuickRoute\Route; Route::get('/', 'MainController@index'); Route::get('/help', 'MainController@help'); //server.php use QuickRoute\Router\Collector; $collector = Collector::create() ->collectFile('routes.php') ->register(); $routes = $collector->getCollectedRoutes();
缓存
缓存路由,这样它们就不需要每次都收集。
use QuickRoute\Router\Collector; $collector = Collector::create() ->collectFile('routes.php') ->cache('path/to/save/cache.php', false) ->register(); $routes = $collector->getCollectedRoutes();
使用闭包缓存路由
use QuickRoute\Route; use QuickRoute\Router\Collector; Route::get('/', function (){ echo uniqid(); }); $collector = Collector::create() ->collect() ->cache('path/to/save/cache.php', true) ->register(); $routes = $collector->getCollectedRoutes();
请注意,您必须指定您的路由包含闭包
传递默认数据
您可以选择将数据传递到所有路由的前面。
在设置/更新默认路由数据后,必须手动清除缓存的路由。
use QuickRoute\Router\Collector; $collector = Collector::create(); $collector->collectFile('api-routes.php', [ 'prefix' => 'api', 'name' => 'api.', 'namespace' => 'Api\\' ]); $collector->register();
更改分隔符
对于Web环境之外的使用,已提供更改默认分隔符("/")的函数。
use QuickRoute\Route; use QuickRoute\Router\Collector; use QuickRoute\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 QuickRoute\Route; use QuickRoute\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 QuickRoute\Route\RouteData
注意
- 当同时使用Collector::collect()和Collector::collectFile()时,您必须小心,因为collectFile方法在开始收集之前会清除先前收集的路由。
确保在调用Collector::collectFile()之前首先调用Collector::collect()。
许可证
路由http动词图像归Riptutorial所有.
QuickRoute是MIT许可的。