extalion / routing
eXtalion 路由组件
0.1.0
2017-10-21 15:24 UTC
Requires
- php: ^7.1
- psr/http-message: ^1.0
Requires (Dev)
- composer/composer: ^1.5
- phpmd/phpmd: ^2.6
- phpspec/phpspec: ^4.1
- squizlabs/php_codesniffer: ^3.1
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(); }