alexkratky / routex
快速路由系统。易于使用。
Requires
- php: >=7.0
- alexkratky/url: 1.0.0
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}
是例如list
或getlatestversion/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'。