math280h / php-router
简单的PHP路由器
v1.1.0
2023-02-16 23:48 UTC
Requires
- aura/view: ^2.4
Requires (Dev)
- guzzlehttp/guzzle: ^7.0
- phpstan/phpstan: ^1.9
- phpunit/phpunit: ^10
- symfony/process: ^6.2
README
简单的PHP路由器,支持中间件和视图功能(使用 aura/view)
安装
composer require math280h/php-router
用法
对于简单用法,您可以直接在路由中内联回调函数,如下所示。
use Math280h\PhpRouter\Router; use Math280h\PhpRouter\Request; session_start(); $router = new Router("./public"); $router->get('/', function () { echo 'Hello World'; }); $router->post('/', function (Request $request) { echo 'Hello World'; }); $router->run();
注意:路由器始终将请求对象传递给回调函数
接受不同的HTTP方法
路由器公开了每个接受HTTP方法的函数。可用方法列表如下
- GET
- POST
- PUT
- DELETE
- OPTIONS
- HEAD
- PATCH
它们可以如此调用
$router->get('/', MyController::class . '::index') $router->post('/', MyController::class . '::index')
路由分组
您可以一起分组路由,这允许您例如为一系列路由定义一个前缀或将对路由集合应用中间件。
您可以这样定义一个路由分组
use Math280h\PhpRouter\Route; $router->group(["prefix" => "test"], [ Route::get('/1', function () { echo 'Hello World'; }), Route::get('/2', function () { echo 'Hello World'; }), ]);
此示例将生成两个路由,路径分别为 /test/1 和 /test/2
添加中间件
路由器支持在连接被接受但请求被转发到回调函数之前运行的中间件。
目前,仅支持直接回调函数,可以按如下方式添加到路由器
$router->addMiddleware("log", function ($request) { print_r($request); });
路由器始终将请求对象传递给回调函数。
一旦中间件被添加到路由器,您可以通过如下方式将其附加到您的路由
$router->get('/', function () { echo 'Hello World'; }, ['log']);
从类传递回调函数到路由器
路由器允许您传递类内部函数的引用而不是内联回调函数。您可以这样操作
class MyController { public function index($request) { echo 'Hello World'; } } $router->get('/', MyController::class . '::index');
返回视图
路由器支持 aura/view,这使得回调函数可以返回视图,路由器会自动渲染它。
这可以通过以下方式实现
class MyController { public function index($request) { $view_factory = new \Aura\View\ViewFactory; $view = $view_factory->newInstance(); $view_registry = $view->getViewRegistry(); $layout_registry = $view->getLayoutRegistry(); $layout_registry->set('default', dirname(__DIR__) . '/views/layouts/default.php'); $view_registry->set('page', dirname(__DIR__) . '/views/my-view.php'); $view->setView('page'); $view->setLayout($layout); return $view; } } $router->get('/', MyController::class . '::index');
建议实现一个辅助函数来创建新的视图,这样您就不必在代码中重复工厂创建
视图辅助函数
视图辅助函数可能看起来像这样
/** * Returns a view Object * * @param string $path * @param array $data * @param string $layout * @return View */ function view(string $path, array $data = [], string $layout = 'default'): View { $view_factory = new \Aura\View\ViewFactory; $view = $view_factory->newInstance(); $view_registry = $view->getViewRegistry(); $layout_registry = $view->getLayoutRegistry(); $layout_registry->set('default', dirname(__DIR__) . '/views/layouts/default.php'); $view_registry->set('page', dirname(__DIR__) . '/views/' . $path . '.php'); $view->setView('page'); $view->setLayout($layout); $view->addData($data); return $view; }