在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:php-srouter开源软件地址:https://gitee.com/inhere/php-srouter开源软件介绍:php simple router非常快速且轻量的请求匹配路由器。
多个版本:
内置调度器:
路由器管理
项目地址安装
composer require inhere/sroute
{ "require": { "inhere/sroute": "dev-master" }}
git clone https://github.com/inhere/php-srouter.git // github 压测自动生成了1000条路由,每条有9个参数位,分别测试1000次的
详细的测试代码请看仓库 https://github.com/ulue/php-router-benchmark
Worst-case matchingThis benchmark matches the last route and unknown route. It generates a randomly prefixed and suffixed route in an attempt to thwart any optimization. 1,000 routes each with 9 arguments. This benchmark consists of 14 tests. Each test is executed 1,000 times, the results pruned, and then averaged. Values that fall outside of 3 standard deviations of the mean are discarded.
First route matchingThis benchmark tests how quickly each router can match the first route. 1,000 routes each with 9 arguments. This benchmark consists of 7 tests. Each test is executed 1,000 times, the results pruned, and then averaged. Values that fall outside of 3 standard deviations of the mean are discarded.
使用说明
首先, 需要导入类 use Inhere\Route\Router;$router = new Router(); 快速开始创建一个简单的 use Inhere\Route\Router;// 需要先加载 autoload 文件require dirname(__DIR__) . '/vendor/autoload.php';$router = new Router();$router->get('/', function() { echo 'hello';});// 开始调度运行$router->dispatch(); 使用php启动一个测试server: 好了,现在你可以访问 http://127.0.0.1:8080 可以看到输出
如果是直接下载的包代码,可以加载 用如下的语句替换上面的 require dirname(__DIR__) . '/test/boot.php'; 添加路由// 匹配 GET 请求. 处理器是个闭包 Closure$router->get('/', function() { echo 'hello';});// 匹配参数 'test/john'$router->get('/test/{name}', function($params) { echo $params['name']; // 'john'}, [ 'name' => '\w+', // 添加参数匹配限制。若不添加对应的限制,将会自动设置为匹配除了'/'外的任何字符]);// 可选参数支持。匹配 'hello' 'hello/john'$router->get('/hello[/{name}]', function() { echo $params['name'] ?? 'No input'; // 'john'}, [ 'name' => '\w+', // 添加参数匹配限制]);// 匹配 POST 请求$router->post('/user/login', function() { var_dump($_POST);});// 匹配 GET 或者 POST$router->map(['get', 'post'], '/user/login', function() { var_dump($_GET, $_POST);});// 允许任何请求方法$router->any('/home', function() { echo 'hello, you request page is /home';});$router->any('/404', function() { echo "Sorry,This page not found.";}); 使用路由组// 路由组$router->group('/user', function ($router) { $router->get('/', function () { echo 'hello. you access: /user/'; }); $router->get('/index', function () { echo 'hello. you access: /user/index'; });}); 使用控制器// 使用 控制器$router->get('/', App\Controllers\HomeController::class);$router->get('/index', 'App\Controllers\HomeController@index'); 备用路由处理可以注册一个备用路由处理。当没匹配到时,就会使用它 $router->any('*', 'fallback_handler');
注意可选参数 - 只能是在路由path的最后 正确的: /hello[/{name}] // match: /hello/tom /hello/my[/{name}[/{age}]] // match: /my/tom/78 /my/tom 错误的: /my[/{name}]/{age} 自动匹配路由支持根据请求的URI自动匹配路由(就像 yii 一样), 需配置 'autoRoute' => 1, // 启用 'controllerNamespace' => 'App\\Controllers', // 控制器类所在命名空间 'controllerSuffix' => 'Controller', // 控制器类后缀
此时请求没有配置路由的 查找逻辑是
设置路由配置// set config$router->config([ 'ignoreLastSlash' => true, 'autoRoute' => 1, 'controllerNamespace' => 'app\\controllers', 'controllerSuffix' => 'Controller',]);
路由匹配array public function match($path, $method)
示例根据请求的 URI path 和 请求 METHOD 查找匹配我们定义的路由信息。 $path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);$method = $_SERVER['REQUEST_METHOD'];$routeInfo = $router->match($path, $method); 根据返回的路由信息,我们就可以自由的决定如何调用对应的处理。
路由调度如果你不想自己实现路由调度,可以使用内置的路由调度器 use Inhere\Route\Dispatcher\Dispatcher;$dispatcher = new Dispatcher([ // default action method name 'defaultAction' => 'index', 'actionPrefix' => '', 'actionSuffix' => 'Action', 'dynamicAction' => true, // @see Router::$globalParams['act'] 'dynamicActionVar' => 'act',]); 设置事件处理// 成功匹配路由$dispatcher->on(Dispatcher::ON_FOUND, function ($uri, $cb) use ($app) { $app->logger->debug("Matched uri path: $uri, setting callback is: " . is_string($cb) ? $cb : get_class($cb));});// 当匹配失败, 重定向到 '/404'$dispatcher->on('notFound', '/404');// 或者, 当匹配失败, 输出消息...$dispatcher->on('notFound', function ($uri) { echo "the page $uri not found!";}); 使用控制器方法通过 $router->get('/', App\Controllers\HomeController::class);$router->get('/index', 'App\Controllers\HomeController@index');$router->get('/about', 'App\Controllers\HomeController@about');
动态匹配控制器方法动态匹配控制器方法, 需配置 'dynamicAction' => true, // 启用// action 方法名匹配参数名称,符合条件的才会当做action名称// @see Router::$globalParams['act'] 匹配 '[a-zA-Z][\w-]+''dynamicActionVar' => 'act',
// 访问 '/home/test' 将会执行 'App\Controllers\HomeController::test()'$router->any('/home/{act}', App\Controllers\HomeController::class);// 可匹配 '/home', '/home/test' 等$router->any('/home[/{act}]', App\Controllers\HomeController::class);
使用方法执行器配置
示例: // 访问 '/user', 将会调用 App\Controllers\UserController::run('')$router->get('/user', 'App\Controllers\UserController');// 访问 '/user/profile', 将会调用 App\Controllers\UserController::run('profile')$router->get('/user/profile', 'App\Controllers\UserController');// 同时配置 'actionExecutor' => 'run' 和 'dynamicAction' => true,// 访问 '/user', 将会调用 App\Controllers\UserController::run('')// 访问 '/user/profile', 将会调用 App\Controllers\UserController::run('profile')$router->any('/user[/{name}]', 'App\Controllers\UserController'); 开始路由匹配和调度$router->dispatch($dispatcher); 运行示例示例代码在
你可以通过 测试phpunit
php example/benchmark.php LicenseMIT 我的其他项目
|
请发表评论