armaaar / mini-router
基于正则表达式的快速PHP路由器
Requires
- php: >=8.0
Requires (Dev)
- phpstan/phpstan: ^1.11
This package is auto-updated.
Last update: 2024-09-06 18:42:30 UTC
README
mini-router是一个基于正则表达式且灵感来源于PHRoute的快速PHP路由器。它主要是为了支持RESTful API而构建的,拥有简单但强大的高速接口。
安装
通过composer安装或直接在索引页面包含src/MiniRouter.php文件并开始使用。
友好URL
为了通过路由器处理所有请求,您需要将所有请求重定向到您想定义路由的页面。如果您使用的是Apache且启用了mod_rewrite,请在根目录下创建一个简单的.htaccess文件。
Options -MultiViews RewriteEngine On RewriteCond %{REQUEST_URI} !\..+$ RewriteRule .* index.php [QSA,L]
查看示例以了解实现方法。
使用
定义路由
mini-router支持GET、HEAD、POST、PUT、PATCH和DELETE方法。
use MiniRouter\MiniRouter; $router = new MiniRouter(); $router->get($route, $handler); # match only get requests $router->post($route, $handler); # match only post requests $router->put($route, $handler); # match only put requests $router->delete($route, $handler); # match only delete requests $router->patch($route, $handler); # match only patch requests $router->head($route, $handler); # match only head requests $router->any($route, $handler); # match any request method $router->start_routing();
这些方法由路由必须匹配的HTTP方法定义,并接受路由模式和可调用的处理程序,这可以是闭包、函数名或['ClassName', 'method']对。
请注意,路由器默认不会回显处理程序返回的值,因此如果您想向客户端发送某些内容,您需要使用echo而不是return。
正则表达式快捷方式
URL可以直接在URL中使用正则表达式或使用以下快捷方式之一
{:i} => ([0-9]+) # numbers only
{:a} => ([0-9A-Za-z]+) # alphanumeric
{:h} => ([0-9A-Fa-f]+) # hex
{:s} => ([a-zA-Z0-9+_\-\.]+) # alphanumeric and + _ - . characters
以下是在路由中使用正则表达式和快捷方式的示例
// you can pass parameters to controllers through URL using shortcuts $router->get('/hello/{:a}/', function($name) { echo "Hello, $name!"; }); // or you can use regular expressions directly into the URL $router->get('/hello-robot/(\d+)', function($robotNumber) { echo "Hello robot number $robotNumber!"; }); // URL parameters assigned to controller parameters in order // Note that regex can be used side by side with shortcuts $router->get('/hello-two/{:s}/([a-zA-Z0-9+_\-\.]+)', function($name1, $name2) { echo "Hello, $name1 and $name2!<br>"; }); // Parameters could be optional but you need to define default values for it's corresponding variables $router->get('/hello-anon/{:a}?/', function($name = "anonymous") { echo "Hello, $name!"; });
反向路由的命名路由
传递一个数组作为第一个参数,其中第一个元素是您的路由,第二个元素是稍后引用它的名称。
$router->get(['/user/{:a}', 'username'], function($name){ echo 'Hello ' . $name; }); $router->get(['/page/{:s}/{:i}', 'page'], function($slug, $id){ echo 'You must be authenticated to see this page: ' . $id; }); // Use the route name and pass any route parameters to redirect the browser to existing route path // If you change your route path above, you won't need to go through your code updating any links/references to that route $router->route('username', 'joe'); // this will redirect the browser to the path '/user/joe' // if you passed a false value to the third argument, the browser will call the handler of the specified route without redirecting $router->route('page', ['intro', 234], false); // this will call the handler of the path '/page/intro/234'
分组
分组应用于URL的前缀。
$router->group('/admin', function($router){ $router->get('pages', function(){ echo 'page management'; }); $router->get('products', function(){ echo 'product management'; }); $router->get('orders', function(){ echo 'order management'; }); });
分组还可以在URL中定义参数,默认情况下,在分组中定义的参数也传递给所有分组路由。
$router->group('/api/v{:i}', function($router, $api_version){ $router->get('users', function($version){ echo $version; }); if ($api_version >= 2) { $router->get('order/{:i}', function($api_version, $order_id){ echo $api_version; }); } });
值得注意的是,路由器在所有路由的开头仅添加域名。因此,如果您的所有路由都在子文件夹或子目录中,请使用文件夹名称作为前缀将所有路由分组。
过滤器
您可以在访问路由之前添加一个必须为真的过滤器。
$router->filter('isLoggedIn', function(){ if($_SESSION['logged_in']) { return true } else { return false } }); $router->get('/user/{:a}', function($name){ echo 'Hello ' . $name; }, "isLoggedIn");
如果过滤器返回任何假值,它将阻止路由处理程序的调度。您可以从PHP布尔类型文档中检查假值。
过滤器分组
将多个路由包裹在一个路由组中,以将过滤器应用于定义在其中的每个路由。如果需要,可以嵌套组。
$router->filter('auth', function(){ if(!isset($_SESSION['user'])) { $router->route('login'); return false; } return true; }); $router->group('/portal', function($router){ $router->get('/user/{:a}', function($name){ echo 'Hello ' . $name; }); $router->get('/page/{:i}', function($id){ return 'You must be authenticated to see this page: ' . $id; }); }, "auth"); $router->get(['/login', 'login'], function($name){ echo 'Please login...' });
查看示例以获取mini-router的更详细的实际使用示例,特别是对于RESTful API。