marceauka / router
无依赖的简单PHP路由器
Requires
- php: >=7.4|>=8.0
Requires (Dev)
- phpunit/phpunit: ^9
README
Router是一个轻量级的PHP HTTP请求路由器。
如果您需要一个简单有效的库,或者您希望有一个 易于理解的路由库,它将是您的完美伴侣。
否则,请查看这些出色的库 symfony/routing 或 league/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动词: POST, PUT, PATCH 和 DELETE。
// 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