alexkratky/routex

快速路由系统。易于使用。

v1.0.0 2020-05-14 09:10 UTC

This package is auto-updated.

Last update: 2024-09-14 19:25:57 UTC


README

快速路由系统。易于使用。

安装

composer require alexkratky/routex

简介

本文档适用于与 panx-framework 一起使用的 RouteX。如果没有 panx-framework,则需要编写自己的处理器。但是,无论是否有 panx-framework,使用方法都是相同的。

RouteX 是 panx-framework 的默认路由系统。RouteX 的文档可在 此处 找到(由于文档是为与 panx-framework 一起使用而编写的,因此某些内容可能有所不同)。

在没有 panx-framework 的情况下运行 RouteX

require 'vendor/autoload.php';

use AlexKratky\URL;
use AlexKratky\Route;
use AlexKratky\RouteHandler;

Route::setError(Route::ERROR_NOT_FOUND, "404.php"); // only if you want custom error 404 page
Route::set('/', 'home.php'); // set routes - URI: '/', template file: 'home.php'

$URL = new URL(); // Creates a new instance of URL object
Route::setMiddlewaresPath($_SERVER['DOCUMENT_ROOT'] . '/middlewares/'); // only if you will use middlewares
Route::setControllersPath($_SERVER['DOCUMENT_ROOT'] . '/controllers/'); // optional (faster improvement)
$template_files = Route::search($URL->getString()); // Searches in all routes and find the right template file

$rh = new RouteHandler($_SERVER['DOCUMENT_ROOT'] . '/template/', $_SERVER['DOCUMENT_ROOT'] . '/controllers/', $_SERVER['DOCUMENT_ROOT'] . '/handlers/'); // *
$rh->setHandlers([
    'latte' => 'LatteHandler'
]); // Sets custom handler for *.latte extension
$rh->handle($template_files); // includes all files or execute function

*创建一个新的 RouteHandler 实例

  • RouteHandler 将需要 Route::search() 提供的所有文件
  • 第一个参数是 template 目录
  • 第二个参数是 controllers 目录
  • 第三个参数是 handlers 目录

对于所有不是 .*php 文件的扩展,都需要处理器。有关处理器的更多信息,请参阅 此处

语法

路由的语法

Route::set("/URI/TO/HANDLE", "File_to_require.php");

在 URI 中,您可以使用通配符(+,*)。

+ 的含义是一个元素,例如:/post/+/edit 将处理 /post/1/edit/post/2/edit、...

* 的含义是一个或多个元素,例如:/post/* 将处理 /post/1,但也处理 /post/1/edit/post/2/view、...

但在 URI 中,您也可以使用参数,例如 /post/{ID}/edit/post/+/edit 有相同的意义,但您可以使用 Route::getValue("ID") 访问 {ID}

默认路由

/routes/ 目录中还有一个名为 default.php 的文件,其中包含默认路由。默认路由包括错误页面的路由。例如错误 404。当您需要为错误代码(403、404)设置路由时,您需要调用函数 Route::setError 而不是 Route::set。示例语法

Route::setError(404, "default/errors/404.php");

使用通配符

请注意,带有通配符的路由应该是最后的,例如

Route::set("/", "home.php");
Route::set("*", "test.php");

这将向所有请求 / 的用户显示 home.php 文件,并向请求不同内容的所有用户显示 test.php

但如果您这样写

Route::set("*", "test.php");
Route::set("/", "home.php");

结果将不同。它将向所有用户显示 test.php,无论用户请求什么。所以如果用户尝试请求 /,框架将显示 test.php 而不是 home.php。所以在这种情况下,第二个路由是多余的,应该删除以保持路由文件清晰。

< action > 和 < controller > 通配符

这些通配符将自动包含控制器并调用由 action 指定的控制器方法。例如,您将具有以下路由

 Route::set("/admin/<controller>/<action>", "form.php");

用户将通过以下 URI 访问: /admin/auth/login/。这将包含 AuthController 并调用由 action 指定的控制器方法 - login()(AuthContoller::login())。

正则表达式规则的参数

您可以使用正则表达式限制路由参数。例如,您想使用参数 {ID},它应该只包含数字,因此您可以这样做

Route::set("example/{ID[^[0-9]*$]}", "id.php");

如果输入的不是仅ID的内容,它将尝试找到其他路由,否则显示404。

带有验证规则的参数

您可以使用验证规则来限制路由参数。例如,您想使用参数{NAME},它应该是一个有效的名称,您可以通过以下方式来实现

Route::set("/{NAME#Validator::validateUsername}");

包含多个文件

如果您想包含更多模板文件,则需要传递数组,例如

Route::set("/docs/intro", ["header.php", "intro.php", "footer.php"]);

没有文件

您可以留空第二个参数(文件或函数),这样就不需要文件,只有当您设置了控制器时才会被调用。

带有重定向的路由

如果您想从一个路由重定向到另一个路由,您可以通过这种方式来实现

Route::set("/docs", function() {
    redirect("/docs/intro");
});
Route::set("/docs/intro", ["header.php", "intro.php", "footer.php"]);

带有函数的路由

路由的第二个参数可以是匿名函数(类似于重定向)。

Route::set("/dumpServerVariable", function() {
    echo 'This route will dump() $_SERVER variable';
    dump($_SERVER); // Function from panx
});

将路由锁定到方法

如果您需要路由仅能通过某些HTTP方法访问,您可以通过传递第三个参数来实现。

Route::set("/", "home.php", ["GET"]);

上面的路由只能使用GET方法访问。

Route::set("/postGet", "example.php", ["POST", "GET"]);

上面的路由可以使用POST和GET方法访问。

第三个参数始终是数组。如果您请求的路由不支持您请求的方法,您将收到错误400 - 错误请求。

API路由

API路由应位于/routes/api.php文件中。您不是使用函数Route::set()设置路由,而是使用Route::apiGroup()。例如

Route::apiGroup("v1", array(
    // /api/v1/list
    array("list", function(){
        echo "list";
    }),
    // /api/v1/getlatestversion/stable
    array("getlatestversion/stable", function() {
        echo "0.1";
    }, ["GET"]),
));

作为第一个参数,您指定API版本,例如v1,第二个参数是包含所有路由的数组。每个路由都是一个数组。在路由数组中,第一个参数是URI,第二个参数是函数、文件或文件数组。第三个参数是可选的。如果您输入第三个参数,它将锁定路由到特定的HTTP方法(有关更多详细信息,请参阅将路由锁定到方法)。

为什么您应该使用API路由而不是经典路由?如果URI的第一个元素是/api/,它将首先检查所有API路由,然后才会检查所有经典路由。因此,它会提高响应速度。

Route::apiGroup()函数将根据以下模式生成路由:/api/{VERSION}/{URI},其中{VERSION}是例如v1,而{URI}是例如listgetlatestversion/stable,如上例所示。

控制器

您可以使用setController()函数来设置控制器

Route::set('/login', 'auth/login.latte')->setController("AuthController");

有关控制器的更多信息,请参阅控制器

中间件

您可以使用setMiddleware()函数来设置控制器

Route::set('/verifymail/{TOKEN}', function() {
    
})->setMiddleware(['AuthMiddleware']);

参数必须是数组,即使您只设置了一个中间件。

有关中间件的更多信息,请参阅中间件

API端点

您可以使用Route::setApiEndpoint()函数来设置API端点

Route::setApiEndpoint("v3", new API("v3"));

有关API端点的更多信息,请参阅API端点

API扩展语法

由于API路由有多个参数,建议使用以下语法

Route::apiGroup("v5", array(
    array(
        "route" => "test/{name}/{action}",
        "files" => null,
        "lock" => null,
        "required_params" => null,
        "action" => "login",
        "alias" => "test"
    ),
));

别名

您可以为每个路由设置别名。这对于您的模板文件很有用,因为您将不会编写绝对路由,例如'/login',而是使用别名。如果您使用Latte,则可以这样做,例如n:link="login",当您在路由文件中更改路由时,您不需要编辑模板文件。在n:link中,您还可以包含路由和GET方法的参数。因此,如果您的路由有通配符,您可以这样做

<?php
Route::set("/test/of/route/<action>/{NAME}/{ID}/*", function() {echo "Hello";});
?>

<a n:link="test, 'action=akce:jmeno:identifikator:hvezdicka=[1,10,20,30]', 'id=10:remember=true:test'">macro test</a>

<!-- which will create -->
<a href="/test/of/route/akce/jmeno/identifikator/1/10/20/30/?id=10&remember=true&test">macro test</a>

要为API路由设置别名,您需要作为第6个参数([5])或通过扩展语法来设置。

必需参数

您可以使用->setRequiredParameters(array $get, array $post);来设置必需参数

其中$get和$post是包含输入名称的数组

Route类的其他函数

Route::searchWithNoLimits()

此函数将返回模板文件/函数,不限制中间件等。仅适用于API路由。用于API端点和缓存路由。

Route::convertRoute($route = null)

将URI转换为路由。

  • 例如,如果您在route.php中将路由设置为'/example/+/edit',并将URI传递给此函数(例如,/example/13/edit),它将返回带有通配符的路由 -> '/example/+/edit'。