zelasli / routing
Zelasli路由模块,将单个HTTP请求链接到控制器操作。
Requires
- php: ^8.1.0
README
一个路由模块,将单个HTTP请求链接到目的地(控制器的操作)
安装
使用composer在你的项目中安装(推荐
)
composer require zelasli/routing
您也可以克隆存储库,并将所有位于src/
中的文件包含到项目的入口点。
git clone https://github.com/zelasli/routing.git
并包含模块文件
require_once 'path/to/src/Placeholders.php'; require_once 'path/to/src/Route.php'; require_once 'path/to/src/RouteBuilder.php'; require_once 'path/to/src/RouteCollection.php'; require_once 'path/to/src/Router.php';
入门指南
创建RouteBuilder
,它将构建URL
到给定目的地的链接。
$routeBuilder = new RouteBuilder(new RouteCollection);
定义链接
定义所有请求链接和分组链接到前缀初始。链接是RouteBuilder
中的一个方法,为请求URL创建Route
并将其链接到操作的目的地。此操作包括类命名空间、要调用的方法及其参数。
第一个参数定义将匹配链接(Route
)的URL,第二个参数是包含操作的类命名空间,以及从第一个参数中提取的参数。
$builder->link('/home', 'HomeController::index')
上述链接也可以定义为以下形式,其中第二个参数是控制器类和操作的数组(要调用的类方法)。
$builder->link('/home', ["HomeController", "index"]);
带参数的链接
链接也可以收集调用控制器操作时要传递的参数。
$builder->link('/blogs/(:digit)', "App\\Controllers\\BlogController::view/{1}");
这意味着匹配/blogs/123456789
将提取值123456789
作为数字,这意味着类App\Controllers\BlogController
中的view
方法有一个收集整数值的参数。
您也可以使用参数名如下
$builder->link('/blogs/(blogId:digit)', "App\\Controllers\\BlogController::view/{blogId}");
带名称的链接
链接也可以有用于反向路由的名称
$builder->link('/blogs/(blogId:digit)', "App\\Controllers\\BlogController::view/{blogId}", [ 'name' => 'blogViewPage' ]);
分组相关链接
您还可以将具有相同初始的相关链接分组。
$builder->group('/blogs', function (RouteBuilder $builder) { $builder->link('/', "App\\Controllers\\BlogController::view_all", [ 'name' => 'blogsViewAll' ]); $builder->link('/create', "App\\Controllers\\BlogController::create", [ 'name' => 'blogsCreate' ]); $builder->link('/view/(blogId:digit)', "App\\Controllers\\BlogController::view/{blogId}", [ 'name' => 'blogsView' ]); $builder->link('/delete/(blogId:digit)', "App\\Controllers\\BlogController::delete/{blogId}", [ 'name' => 'blogsDelete' ]); $builder->link('/update/(blogId:digit)', "App\\Controllers\\BlogController::update/{blogId}", [ 'name' => 'blogsUpdate' ]); });
与Router一起工作
Router
的主要用途是查找匹配当前HTTP请求URL的Route
。现在,从构建器中获取Router
对象实例。
$router = $routeBuilder->getRouterInstance();
查找匹配的Route
在这里,您将要求Router
为您提供您提供的指定者匹配的Route
。
$url = parse_url($_SERVER['REQUEST_URI']); // use parse_url() because query string may have been exists $route = $router->findRouteByUrl($url['path']);
如果客户端请求如下:http:://example.com/blogs/view/123456789
,则Router
将在集合中搜索并找到匹配的Route
实例。现在获取类及其方法
// http:://example.com/blog/123456789 $class = $route->getClass(); // App\Controllers\BlogController $action = $route->getAction(); // view $params = $route->getParams(); // [blogId => 1282]
准备调用操作(方法)
$obj = new $class(); // $obj = new App\Controllers\BlogController(); $obj->{$action}(...$params); // $obj->view(...[blogId => 1282])
反向URL
Router
还可以使用Router::reverseUrl
使用户名链接(Route
)的URL字符串反向。
$router->reverseUrl('blogsView', [ 'blogId' => 1234 ]); // return: /blogs/view/1234
您还可以使用Router::registerPlaceholder
函数定义自己的占位符类型。
Router::registerPlaceholder('date', '\d{4}\/\d{1,2}\/\d{1,2}', false);
传入的第一个参数是类型的名称,第二个是模式,第三个是布尔值,表示您定义的类型是否可以具有量词,默认为true。然后像使用类型一样使用它
$builder->link('/blog/(d:date)/(id:digit)', 'App\\Blog\\Post::view/{date}/{id}');
上述类型将匹配请求:http://example.com/blog/2006/3/21/1234
。这将提取2006/3/21
作为$d
和1234
作为$id
。
Route
正如我们之前所看到的,我们使用builder->link($url, $destination, $options)
创建新的Route,将$url
链接到$destination
,带有可选参数$options
。现在让我们深入了解它。
Route URL
RouteBuilder::link
中的第一个参数$url
可以包含要提取的占位符,称为可变参数,可以将其作为参数传递给类方法。此占位符的规则语法如下
([名称][:类型][:量词])
[名称] - 可选。此占位符的参数名称
[:类型] - 此占位符可以持有的值的类型。
[:量词] - 可选。值的长度。
第二个参数是请求URL的目的地,该URL由Route
映射。它包含一个类及其方法,参数根据在方法中编写的顺序提供。
路由类型
这些是定义的有效占位符类型的列表。
对于可以有量词的占位符,这是它们可以书写的格式。