akibatech/router

此包已被弃用,不再维护。作者建议使用 marceauka/router 包。

无依赖的简单PHP路由器

2.0.1 2020-12-15 21:03 UTC

This package is auto-updated.

Last update: 2020-12-15 21:05:15 UTC


README

Build Status

Router 是一个用PHP编写的轻量级HTTP请求路由器。

如果您需要一个简单而有效的库,或者您想要一个 易于理解的路由库,它将是您的完美伴侣。
否则,请查看这些出色的库 symfony/routingleague/route

安装

可以使用 composer 安装 Router: composer require marceauka/router。目前,它需要 PHP 7.4 或 8.0。

此外,将 src/Router.php 复制粘贴到您想要的位置,并 require 它

配置 Apache

路由器可以与任何类型的URL完美工作,但如果您想要一些URL重写,可以使用此示例 .htaccess。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

用法

实例化

Router 没有参数。

$router = new Router;

添加路由

一旦有了实例,添加路由就像儿戏一样。

// Will respond to : /hello (en GET)
$router->get('hello', function () {
	echo 'Hello world!';
});

您的路由可以遵循以下HTTP动词: POSTPUTPATCHDELETE

// POST request
$router->post(...);
// PATCH request
$router->patch(...);

一个路由可以使用多个HTTP动词

// GET and POST requests
$router->add(['GET', 'POST'], 'hello', ...);
// ... Or all HTTP verbs
$router->any('hello', ...);

最后,路由可以链式或使用回调添加

// Chaining
$router->get('foo', ...)->get('bar', ...);
// ...or via a callback
$router->routes(function ($router) {
	// Votre logique
});

如果没有给 routes() 方法提供回调,则返回所有路由。

$router->get('hello', ...);

var_dump($router->routes()); // Returns [1 => ['uri' => 'hello', 'action' => '...']]

监听请求

为了让一切正常工作,Router 需要监听传入的请求

// Will use REQUEST_URI and REQUEST_METHOD
$router->listen();
// You can spoof them with your own logic (Request library for example).
$router->listing('request', 'method');

分发操作

显然,对于每个路由,都需要一个。您需要为它们中的每一个定义一个操作。

  • 回调
$router->get('hello', function () {
	echo 'Hello!';
})
  • 类(控制器、...)
$router->get('hello', 'MyClass@myMethod');

在这里,一旦匹配到路由,将实例化名为 "MyClass" 的类,并调用 "myMethod" 方法。
注意:如果您的应用程序可以自动加载它们(PSR-4,...),Router 将 接受命名空间

$router->get('route-namespace', 'App\Http\Controller@myMethod');

此外,您可以定义一个全局命名空间,适用于所有操作。

// Will call App\Http\Controller\Account@resume()
$router->namespaceWith('App\Http\Controller')->get('mon-account', 'Account@resume');

您还可以定义一个当没有匹配到任何路由时的未找到操作。

$router->whenNotFound(function () {
    echo 'Page not found';
});

URL参数

您的路由可以包含动态参数。用法很简单。

// Autorise "profile/1" or "profile/12" but not "profile/john".
$router->get('profile/{:num}', ...);

参数可以是

  • {:num} 表示数字值
  • {:alpha} 表示字母值
  • {:any} 表示所有类型的字符
  • {:slug} 表示数字、字母、连字符 (-) 和 at 符号 (@)

匹配后,参数将按URL中定义的顺序发送到相应的操作。

$router->get('profile/{:num}/{:alpha}', function ($id, $name) {
	echo "My name is $name and my ID is $id !";
});

命名路由

您可以为您的路由 命名 以便稍后访问它们或轻松创建链接(例如在视图中)。

$router->get('/homepage', '...', 'home');
$router->link('home'); // Returns "/homepage"

如果您的路由包含参数,您可以构建一个带有填充参数的URI。
您需要提供路由期望的所有参数,否则将抛出异常。

$router->get('/tag/{:slug}', '...', 'tag');
$router->link('tag', 'wordpress'); // => Returns "/tag/wordpress"

$router->get('/user/{:num}/{:any}', '...', 'profile');
$router->link('profile', [42, 'JohnDoe']); // => Returns "/user/42/JohnDoe"

缓存

有时,当我们的路由器包含许多路由时,为每个脚本执行提供一个现成的Router实例是很方便的。Router支持序列化反序列化。存在两个助手来帮助您。

  • 导出配置实例
$compiled = $router->getCompiled(); // Retourns a string
  • 导入配置实例
$router = MarceauKa\Router::fromCompiled($compiled); // Returns the instance previously configured

注意:使用回调的路由无法序列化。只有"MyClass@myMethod"可以序列化。
该路由器不提供存储或读取缓存文件的功能。这不是它的目标。

测试

测试使用PHPUnit 9。您可以使用位于vendor/bin中的phpunit命令。

vendor/bin/phpunit

测试可能不完整。请随时贡献力量。

许可证

MIT