hypario/router

面向初学者的简单路由器

1.7.0 2020-12-13 11:31 UTC

README

Build Status Coverage Status

这个路由器是一个项目,旨在让想要了解路由器工作原理的人使用,它可以用来快速开始一个项目,而无需使用任何框架,如Laravel或Symfony。

安装

您可以使用composer安装此包。

composer require hypario/router

如何使用它

基础

在这里,我们将讨论如何使用路由来处理不需要参数的路由。

像其他路由器一样,您必须初始化路由器,并像这样编写您想要的路线

$router = new Hypario\Router(); // Here no parameters needed
$router->get('/', function () { echo "Hello World"; }); // Define a route in GET method.

您可以选择其他方法,例如POST方法。

$router = new Hypario\Router();
$router->post('/', function () { echo "Route accessed via POST method"; });

小心!这些方法并不意味着您可以访问这些页面,现在您必须匹配您的URL和路由。

如何匹配URL和路由

要匹配路由,您必须使用路由器的match方法,它将返回路由或null(如果没有匹配)。

$router = new Hypario\Router();
$router->get('/', function () { echo "Hello World"; });

$route = $router->match($_SERVER['REQUEST_URI']);

在这里,$_SERVER['REQUEST_URI']用于获取URL,但您可以使用实现ServerRequestInterface的PSR对象或自定义的$_GET来提供URL。

当您获取到匹配的路由时,您可以得到处理程序(这里是一个函数)。

$router = new Hypario\Router();
$router->get('/', function () { echo "Hello World"; });

$route = $router->match($_SERVER['REQUEST_URI']); // We get the matched route

if (!is_null($route)) {
    $function = $route->getHandler(); // We get the function
    call_user_func($function); // We call the function of the matched route
}

输出:如果URL是您的网站主页 www.mydomain.com,则输出 Hello World

处理程序可以是字符串(如可调用类的名称)或可调用(如这里,一个函数),因为路由器不处理您调用处理程序的方式。

带参数的路由

带参数的路由是经典路由,但每当您想要添加参数时,它必须由{}包围,并且参数的名称和匹配模式由:分隔,如下所示。

$router->get('/hello/{name:[a-z]+}', function($name) { echo "Hello $name";});

$route = $router->match($_SERVER['REQUEST_URI']);

if (!is_null($route)) {
    $function = $route->getHandler();
    call_user_func_array($function, $route->getParams());
}

{name:[a-z]+}是路由/hello的一个必需参数,其中name是参数的名称,[a-z]+是匹配参数的模式。

命名路由

路由的名称只是您想要创建的方法的另一个参数。

$router->get('/', 'handler', 'index'); # creates a route called index

现在我可以生成一个指向我的索引的URI,这将返回/

$pathToIndex = $router->getPath('index');

它也适用于带参数的路由,您只需将参数数组添加到函数中即可。

$router->get('/articles/{id:[0-9]+}', 'handler', 'article');

$pathToArticle = $router->getPath('article', ["id" => 1]); 
// returns /articles/1

如果两个路由具有相同的名称,则将生成最后定义的路由的路径。

$router->get('/', 'handler', 'index');
$router->get('/a', 'handler', 'index');

$pathToIndex = $router->getPath('index');
// returns /a