extalion/routing

eXtalion 路由组件

0.1.0 2017-10-21 15:24 UTC

This package is auto-updated.

Last update: 2024-09-11 13:57:45 UTC


README

Uri 路径解析路由组件

安装

composer require extalion/routing

路由

它是一个代表请求方法和 Uri 路径的类。它还存储了一个知识库,即哪个控制器类创建来处理请求。

use eXtalion\Component\Routing\Route;

$route = new Route\{Method}(
    $uriPath,
    $fullnameControllerClass
);

其中

  • {Method} 是代表请求方法的类名。可用的类名/请求方法
  • Get,
  • Post,
  • Put,
  • Update,
  • Delete,
  • $uriPath 是一个有效的 Uri 路径,可以包含参数(见示例),
  • $fullnameControllerClass 是一个自解释的名称 :-)

示例

new Route\Get('/', HomeController::class);
new Route\Get('/user', UserController::class);
new Route\Put('/user', User\SaveController::class);
new Route\Delete('/user/delete/{id}', User\DeleteController::class);
new Route\Delete('/user/delete/all', User\CleanUpController::class);

路由 DELETE:/user/delete/{id} 有一个参数 id,这意味着此路由将匹配到以下请求(所有这些请求都具有 DELETE 方法请求)

example.com/user/delete/1
example.com/user/delete/4
example.com/user/delete/nsgfg3
example.com/user/delete/...

但是请求 example.com/user/delete/all 将匹配到路由 DELETE:/user/delete/all。您不需要关心路由定义的顺序,常量路径始终在“参数”路径之前。

如果您的控制器类有任何依赖项,可以将它们作为第三个参数放入数组中

$postRepository = new Repository\Post\Pdo(...);
$mailer = new Mailer\Swift(...);

new Route\Put(
    '/post',
    PostController::class,
    [
        $postRepository,
        'some_string_parameter',
        $mailer,
    ]
);

要从 Uri 路径中提取参数,请调用方法 Route::extractParameters($uriPath)

$route = new Route\Get('/post/{id}/{action}', PostController::class);

$parameters = $route->extractParameters('/post/3/show');

var_dump($parameters);

// array(2) {
//   'id' => string(1) "3"
//   'action' => string(4) "show"
// }

您可以在提取路径时验证您的参数

$route = new Route\Get(
    '/post/{id}/{action}/{language}',
    PostController::class,
    [],
    [
        'id' => function (string $id): int {
            return (int) $id;
        },
        'action' => function (string $action): string {
            return $action . '.php';
        }
    ]
);

$parameters = $route->extractParameters('/post/3/show/pl');

var_dump($parameters);

// array(2) {
//   'id' => int(3)
//   'action' => string(8) "show.php"
//   'language' => string(2) "pl"
// }

新的请求方法路由

如果您想添加新的请求方法路由,您必须创建一个新的类并扩展 \eXtalion\Component\Routing\Route

路由器 (\Basic)

它是一个处理 \Psr\Http\Message\RequestInterface 的类,并返回与请求方法和 Uri 路径匹配的 Route

示例

use eXtalion\Component\Routing\Router;

$router = new Router\Basic(
    new Route\Get(...),
    new Route\Get(...),
    new Route\Post(...),
    ...
);

$request = ... // Something what return \Psr\Http\Message\RequestInterface

$route = $router->handle($request);

如果您尝试添加两个与相同 Uri 路径完全匹配的路由,将抛出 \eXtalion\Component\Routing\Exception\RouteConflict

try {
    $router = new Router\Basic(
        new Route\Get('/user/{id}', ...),
        new Route\Get('/user/{login}', ...)
    );
} catch (RouteConflict $ex) {
    echo $ex->getMessage();
}