hexbit / router
Wordpress 路由器
Requires
- php: ^7.2|^8.0
- altorouter/altorouter: ^2.0
- symfony/http-foundation: ^5.0
Requires (Dev)
- phpunit/phpunit: ^6.0
README
一个基于 SymfonyHttpFoundation 和 AltoRouter 的简单 PHP 路由器,基于 laravel API 构建。这个库实际上是为了使在 RootsSage 开发框架上的路由更加容易而构建的,但它也可以在其他系统中使用
安装
composer require hexbit/router
使用方法
创建路由
映射方法
创建路由是通过使用 map
函数来完成的
在 wordpress 中
// for wordpress projects use Hexbit\Router\WordPress\Router; // first init router add_action("init", function () { Router::init(); }); // Creates a route that matches the uri `/posts/list` both GET // and POST requests. Router::map(['GET', 'POST'], 'posts/list', function () { return 'Hello World'; });
如果你不使用 WordPress 系统,请使用下面的路由器类,并且你可以在适当的时间尝试匹配你的当前请求。
// use this class for non wordpress systems use Hexbit\Router\Router; // Creates a route that matches the uri `/posts/list` both GET // and POST requests. Router::map(['GET', 'POST'], 'posts/list', function () { return 'Hello World'; });
map()
接收 3 个参数
methods
(数组):匹配请求方法的列表,有效值GET
POST
PUT
PATCH
DELETE
OPTIONS
uri
(字符串):要匹配的 URIaction
(函数|string):可以是闭包或控制器字符串
路由参数
可以使用 {keyName}
语法在路由上定义参数。当匹配包含参数的路由时,会将 RouteParams
对象的实例传递给动作。第二个参数是包含当前请求信息的 Symfony\Component\HttpFoundation\Request
对象的实例。
Router::map(['GET'], 'posts/{id}', function(RouteParams $params, Request $request) { return $params->id; });
命名路由
可以给路由命名,以便可以程序化地生成它们的 URL
Router::map(['GET'], 'posts/all', function () {})->name('posts.index'); $url = Router::url('posts.index');
如果路由需要参数,你可以作为第二个参数传递一个关联数组
Router::map(['GET'], 'posts/{id}', function () {})->name('posts.show'); $url = Router::url('posts.show', ['id' => 123]);
HTTP 动词快捷方式
通常你只需要为路由允许一个 HTTP 动词,对于这些情况,可以使用以下快捷方式
Router::get('test/route', function () {}); Router::post('test/route', function () {}); Router::put('test/route', function () {}); Router::patch('test/route', function () {}); Router::delete('test/route', function () {}); Router::options('test/route', function () {});
设置基础路径
路由器假定你正在从域的路由开始工作。如果不是这种情况,你可以设置基础路径
Router::setBasePath('base/path'); Router::map(['GET'], 'route/uri', function () {}); // `/base/path/route/uri`
控制器
如果你想使用一个类来将相关的路由动作组合在一起,你可以将控制器字符串传递给 map()
而不是闭包。字符串的格式是 {类名}@{方法名}
。使用完整的命名空间与类名是很重要的。
示例
// TestController.php namespace \MyNamespace; class TestController { public function testMethod() { return 'Hello World'; } } // routes.php Router::map(['GET'], 'route/uri', '\MyNamespace\TestController@testMethod');
创建分组
通常将类似的路由分组在共同的名称前缀之后。这可以通过使用路由分组来实现
Router::group('api/v1/', function ($group) { $group->map(['GET'], 'route1', function () {}); // `/prefix/route1` $group->map(['GET'], 'route2', function () {}); // `/prefix/route2§` });
匹配路由到请求
一旦定义了路由,你可以使用 match()
函数尝试将当前请求与它们匹配。 match()
接受 Symfony 的 Request
实例,并返回 Symfony 的 Symfony\Component\HttpFoundation\Response
实例。
// bool|Response $response = Router::match(); // send response if route matches with current request if ($response && $response->getStatusCode() !== Response::HTTP_NOT_FOUND) { $response->send(); exit(); }
如果你从闭包中返回一个 Response
实例,它将未经修改地返回。然而,如果你返回其他内容,它将被包装在一个包含你的返回值的 Response
实例中。
在未找到的情况下
如果没有任何路由匹配请求,将返回布尔值 false
作为匹配响应。
Wordpress 虚拟页面
此功能允许您即时创建模板页面,无需在数据库中创建该页面。
// by default laods page-custom-admin-login.php $loginPage = new VirtualPage('custom-admin-login', 'Admin Login Title'); Router::virtualPage('login-admin/', $loginPage);
现在,http://yoursite.domain/login-admin
加载虚拟页面模板。
贡献
欢迎提交拉取请求。对于主要更改,请先打开一个问题,讨论您想要进行哪些更改。
请确保根据需要更新测试。
许可证
MIT