hypario / router
面向初学者的简单路由器
1.7.0
2020-12-13 11:31 UTC
Requires
- php: >=7.4
- psr/http-message: ^1.0
Requires (Dev)
- php-coveralls/php-coveralls: ^2.1
- phpunit/phpunit: ^9.5
- squizlabs/php_codesniffer: ^3.5
README
这个路由器是一个项目,旨在让想要了解路由器工作原理的人使用,它可以用来快速开始一个项目,而无需使用任何框架,如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