akibatech / router
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