zelasli/routing

Zelasli路由模块,将单个HTTP请求链接到控制器操作。

v0.2.8 2024-01-04 01:49 UTC

This package is auto-updated.

Last update: 2024-09-07 23:54:36 UTC


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作为$d1234作为$id

Route

正如我们之前所看到的,我们使用builder->link($url, $destination, $options)创建新的Route,将$url链接到$destination,带有可选参数$options。现在让我们深入了解它。

Route URL

RouteBuilder::link中的第一个参数$url可以包含要提取的占位符,称为可变参数,可以将其作为参数传递给类方法。此占位符的规则语法如下

([名称][:类型][:量词])

[名称] - 可选。此占位符的参数名称

[:类型] - 此占位符可以持有的值的类型。

[:量词] - 可选。值的长度。

第二个参数是请求URL的目的地,该URL由Route映射。它包含一个类及其方法,参数根据在方法中编写的顺序提供。

路由类型

这些是定义的有效占位符类型的列表。

对于可以有量词的占位符,这是它们可以书写的格式。