northwoods/router

适用于PSR-15请求处理器的快速路由器

1.1.0 2018-11-06 17:05 UTC

This package is auto-updated.

Last update: 2024-09-18 04:10:16 UTC


README

Build Status Code Quality Code Coverage Latest Stable Version Total Downloads License

这是一个基于FastRoute的路由器,旨在与PSR-15中间件一起使用。

安装

使用composer(composer)安装和此包的方式最佳。

composer require northwoods/router

使用方法

该路由器实现了MiddlewareInterface,因此可以与任何中间件分发器一起使用,例如Broker

use Northwoods\Router\Router;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;

$router = new Router();
$router->get('user.list', '/users', $userList);
$router->get('user.detail', '/users/{id:\d+}', $userDetail);
$router->post('user.create', '/users', $userCreate);

assert($router instanceof Psr\Http\Server\MiddlewareInterface);

这是路由器的推荐使用方法,因为它确保请求被正确设置以供路由处理程序使用。通常,路由器应该是堆栈中的最后一个中间件。

如果您更喜欢在没有中间件的情况下使用路由器,则该路由器还实现了RequestHandlerInterface,可以直接使用。

/** @var ServerRequestInterface */
$request = /* create server request */;

/** @var ResponseInterface */
$response = $router->handle($request);

路由处理程序

所有路由处理程序都必须实现RequestHandlerInterface接口。

namespace Acme;

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;

class UserListHandler implements RequestHandlerInterface
{
    public function handle(ServerRequestInterface $request): ResponseInterface
    {
        /** @var array */
        $users = /* load from database, etc */;

        return new Response(200, ['content-type' => 'application-json'], json_encode($users));
    }
}

如果希望延迟加载处理程序,则可以使用lazy-middleware包。

use Northwoods\Middleware\LazyHandlerFactory;

/** @var LazyHandlerFactory */
$lazyHandler = /* create the factory */;

$router->post('user.create', '/users', $lazyHandler->defer(CreateUserHandler::class));

反向路由

反向路由允许从路由生成URI。

$uri = $router->uri('user.detail', ['id' => 100]);

assert($uri === '/users/100');

API

Router::add($name, $route);

添加一个完全构建的路由。

Router::get($name, $pattern, $handler)

添加适用于HTTP GET请求的路由。

Router::post($name, $pattern, $handler)

添加适用于HTTP POST请求的路由。

Router::put($name, $pattern, $handler)

添加适用于HTTP PUT请求的路由。

Router::patch($name, $pattern, $handler)

添加适用于HTTP PATCH请求的路由。

Router::delete($name, $pattern, $handler)

添加适用于HTTP DELETE请求的路由。

Router::head($name, $pattern, $handler)

添加适用于HTTP HEAD请求的路由。

Router::options($name, $pattern, $handler)

添加适用于HTTP OPTIONS请求的路由。

Router::process($request, $handler)

作为中间件进行路由分发。

如果找不到路由,将使用$handler生成响应。

Router::handle($request)

为请求分发路由。

如果找不到路由,将返回HTTP 404状态的响应。

如果找到了路由,但请求方法不允许,将返回HTTP 405状态的响应。

致谢

借鉴了zend-expressive-fastroute的一些想法来处理反向路由