noa / router
一个简单的PHP路由器,用于处理复杂的路由模式
Requires
- php: >5.5
- guzzlehttp/psr7: ^1.4
- http-interop/response-sender: ^1.0
- psr/http-message: ^1.0
Requires (Dev)
- php: >7.0
- diablomedia/phpunit-pretty-printer: dev-master
- phpunit/phpunit: ^6.3
This package is not auto-updated.
Last update: 2024-09-29 04:09:00 UTC
README
另一个路由器
这是一个简单的PHP路由器,用于处理复杂的路由模式
描述
提供了一种简单的方式来处理参数化路由,符合PSR-7规范。
安装
composer require noa/router
用法
如何创建一个路由器
路由器处理路由,您必须在添加路由之前创建路由器。
<?php
require_once vendor/autoload.php
use Noa\Router\Router;
$router = new Router();
获取路由器实例
您也可以通过静态调用获取路由器实例,带或不带自定义配置
$router = Router::getInstance();
当您想要销毁此实例以创建一个新的实例时,只需
Router::destroy();
如何定义路由
路由是一组三个属性
- 与路由匹配的HTTP动词
- 路由的路径模式
- 匹配时调用的函数
您可以定义任意多的路由。
例如,这里有一个 DummyController
namespace Noa\Router\Example;
class DummyController
{
public function testGet() {
return 'success Get';
}
public function testPut() {
return 'success Put';
}
public function testPost() {
return 'success Post';
}
public function testDelete() {
return 'success Delete';
}
public function testWithParameter($param) {
return 'success '.$param;
}
public function testWithMoreParameter($param, $param2) {
return 'success '.$param.':'.$param2;
}
public function testWithMoreParameterConstraint($param, $param2) {
return 'success constraint '.$param.':'.$param2;
}
}
简单的GET路由
这是可能的最简单的路由
$router->get('/test/closure', function (){
return 'success closure';
});
控制器
在闭包之外,您可以使用类方法作为控制器
可调用必须遵循此模式
\Namespace\Of\Class\ClassName#method
与HTTP动词匹配的模式
一个模式可以匹配多个HTTP动词,当然,您可以将相同的控制器关联到所有这些动词。
$router->get('/object', 'Noa\Router\Example\DummyController#testGet');
$router->put('/object', 'Noa\Router\Example\DummyController#testPut');
$router->post('/object', 'Noa\Router\Example\DummyController#testPost');
$router->delete('/object', 'Noa\Router\Example\DummyController#testDelete');
参数化路由
您可以通过在路由部分之前添加分号来参数化。因此,所有类似以下URL的路由都将匹配此路由
- /test/test
- /test/12
- /test/whatever
将匹配此路由
$router->get('/object/:param', 'Noa\Router\Example\DummyController#testWithParameter');
同样的结果也可以通过闭包实现。
$router->get('/object/closure/:param', function ($param){
return 'success closure '.$param;
});
参数约束
有时您只想在参数匹配特定正则表达式时匹配路由,with方法允许对参数(以":"开始的路由部分)添加约束
这两个路由具有相同的动词和相同的模式,但由于对:param2的约束,被视为不同的路由
您可以按需链式添加任意多的约束。
$router->get('/object/:id/:method/:param', 'Noa\Router\Example\DummyController#testWithMoreParameterConstraint')
->with('method', '[a-z]+')
->with('param', '[0-9]+')
->with('id', '[0-9]+');
$router->get('/object/:id/:method', 'Noa\Router\Example\DummyController#testWithMoreParameter');
启动路由匹配器
run方法将调用路由控制器,如果请求URL和HTTP动词与某个路由匹配
run方法的返回值将是控制器返回的值,您可以根据需要处理这个返回值。
在这个例子中,我们只回显这个返回值。
如果没有路由匹配,将抛出异常。
try {
echo $router->run();
} catch (\Noa\Router\RouterException $e) {
switch ($e->getCode()) {
case \Noa\Router\RouterException::ROUTE_NOT_FOUND:
// Some 404 page
break;
default:
// Something else
break;
}
}
所有这些代码都包含在example文件夹中。
您可以使用PHP内部服务器
cd example
php -S localhost:8082 -t .
然后,您可以使用curl或Postman来测试路由匹配
PSR-7
此路由器符合PSR-7规范。这意味着您将接收到一个符合PGP-FIG描述的Request对象,并返回一个也符合PSR-7规范的Response。
有两个函数可以返回这些对象
第一个是只读的,处理服务器接收到的所有参数。
$request=Router::getRequest();
第二个允许在返回之前将数据设置到响应中。
$response=Router::getResponse();
有关更多信息,请参阅此处。