marceauka/router

无依赖的简单PHP路由器

2.0.1 2020-12-15 21:03 UTC

This package is auto-updated.

Last update: 2024-09-16 05:23:16 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