hexbit/router

Wordpress 路由器

1.1.1 2021-11-02 15:18 UTC

This package is auto-updated.

Last update: 2024-09-23 09:42:57 UTC


README

CI

一个基于 SymfonyHttpFoundationAltoRouter 的简单 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 (字符串):要匹配的 URI
  • action (函数|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