zanko-khaledi / php-simple-router
2.0.1
2023-08-17 06:01 UTC
Requires
- php: >= 8.1
- guzzlehttp/guzzle: ^7.0
- phpunit/phpunit: 9.*
- vlucas/phpdotenv: ^5.5
This package is auto-updated.
Last update: 2024-09-06 19:35:24 UTC
README
这个轻量级的路由库可以用于小型PHP Web项目或构建您的API。
安装
$ composer require zanko-khaledi/php-simple-router
用法
您可以使用此路由器如下所示
<?php use ZankoKhaledi\PhpSimpleRouter\Request; use ZankoKhaledi\PhpSimpleRouter\Router; require __DIR__ . "/vendor/autoload.php"; Router::get('/',function (Request $request){ echo "Hello World"; }); Router::get('/foo',function (Request $request){ echo "foo route"; }); Router::executeRoutes();
使用控制器代替回调函数
<?php use App\Controllers\FooController; use ZankoKhaledi\PhpSimpleRouter\Router; require __DIR__ . "/vendor/autoload.php"; Router::get('/foo/create',[FooController::class,'create']); Router::post('/foo',[FooController::class,'store']); Router::executeRoutes();
但是,您仍然可以使用动态路由参数
<?php use ZankoKhaledi\PhpSimpleRouter\Request; use ZankoKhaledi\PhpSimpleRouter\Router; require __DIR__ . "/vendor/autoload.php"; Router::get('/bar/{id}',function (Request $request){ echo $request->params()->id; }); Router::get('/foo/{file}',function (Request $request){ echo $request->params()->file; })->where('/foo\/[a-z]+/'); Router::executeRoutes();
路由集合
为模块化路由添加路由集合
<?php use ZankoKhaledi\PhpSimpleRouter\RouterCollection; require __DIR__."/vendor/autoload.php"; RouterCollection::executeRoutesFrom('./Modules/*/routes/*.php');
注意
如果您使用RouterCollection
类加载路由文件,您必须避免在路由文件中调用 Router::executeRoutes()
,因为一旦从 RouterCollection
调用 executeRoutesFrom()
方法,该方法就会调用一次,所以只需这样做:<?php // Modules/Product/routes/product.php use ZankoKhaledi\PhpSimpleRouter\Router; use ZankoKhaledi\PhpSimpleRouter\Request; Router::get('/products',function (Request $request){ // your code });
请求方法
您只能使用以下请求方法来处理您的API
GET,POST,PUT,PATCH,DELETE
中间件
创建一个类,例如 AuthMiddleware,该类实现了 IMiddleware 协议
<?php use ZankoKhaledi\PhpSimpleRouter\Interfaces\IMiddleware; use ZankoKhaledi\PhpSimpleRouter\Interfaces\IRequest; class AuthMiddleware implements IMiddleware { public function handle(IRequest $request,Callable $next) { if(!isset($_SESSION['admin']) && $_SESSION['admin'] !== 'zanko'){ header("Location:/"); exit(); } $next($request); } }
中间件创建后,您应该将其注册到您的路由器上
<?php use App\Middlewares\AuthMiddleware; use ZankoKhaledi\PhpSimpleRouter\Router; use ZankoKhaledi\PhpSimpleRouter\Request; require __DIR__ . "/vendor/autoload.php"; Router::get('/foo',function (Request $request){ // your code })->middleware([AuthMiddleware::class]); Router::executeRoutes();
分组
您可以使用分组路由绑定
<?php use ZankoKhaledi\PhpSimpleRouter\Request; use ZankoKhaledi\PhpSimpleRouter\Router; use ZankoKhaledi\PhpSimpleRouter\Interfaces\IRoute; require __DIR__ . "/vendor/autoload.php"; Router::group(['prefix' => '/foo'],function (Request $request){ Router::get('/bar',function (Request $request){ // your code }); }); Router::executeRoutes();
您还可以将中间件绑定到分组方法
<?php use ZankoKhaledi\PhpSimpleRouter\Request; use ZankoKhaledi\PhpSimpleRouter\Router; use App\Middelwares\AuthMiddleware; use App\Controllers\FooController; require __DIR__ . "/vendor/autoload.php"; Router::group(['prefix' => '/bar','middleware' => [AuthMiddleware::class]],function (){ Router::get('/foo/{id}',function (Request $request){ echo $request->params()->id; }); Router::post('/foo',[FooController::class,'store']); }); Router::executeRoutes();
您还可以在 group
方法中使用子域名,如下面的代码块所示
use ZankoKhaledi\PhpSimpleRouter\Request; use ZankoKhaledi\PhpSimpleRouter\Router; use App\Middelwares\AuthMiddleware; require __DIR__ . "/vendor/autoload.php"; Router::group([ 'domain' => 'example.local' ,'prefix' => '/bar' ,'middleware' => [AuthMiddleware::class]] ,function (){ // code }); Router::executeRoutes();
默认情况下,您的域名是 localhost,您可以在项目的根目录中的 .env
文件中更改它,例如
HOSTNAME = mysite.local
在设置 HOSTNAME
变量后,您必须在项目根目录的 index.php
文件中或公共目录中添加以下代码行
use ZankoKhaledi\PhpSimpleRouter\Request; use ZankoKhaledi\PhpSimpleRouter\Router; use ZankoKhaledi\PhpSimpleRouter\RouterCollection; use App\Middelwares\AuthMiddleware; require __DIR__ . "/vendor/autoload.php"; Router::loadConfigs(__DIR__); // this method called for loading .env variables Router::group([ 'domain' => 'subdomain.mysite.local' ,'prefix' => '/bar' ,'middleware' => [AuthMiddleware::class]] ,function (){ // code }); Router::executeRoutes();
测试
<?php declare(strict_types=1); use PHPUnit\Framework\TestCase; use ZankoKhaledi\PhpSimpleRouter\Router; class Test extends TestCase { protected string $baseUri = 'https://:8000'; public function test_get_route() { $request = Router::assertRequest($this->baseUri); $response = $request->assertGet('/foo',[]); $this->assertEquals(200,$response->status()); $this->assertJson($response->json()); $this->assertSame(json_encode([ 'name' => 'Zanko' ]),$response->body()); } public function test_foo_post_route() { $request = Router::assertRequest($this->baseUri); $response = $request->assertPost('/foo',[ 'form_params' => [ 'name' => 'Teddy' ] ]); $this->assertEquals(201,$response->status()); $this->assertJson($response->json()); $this->assertSame(json_encode([ 'name' => 'Foo' ]),$response->json()); } }
您可以使用上面的代码块测试您的API。一些测试API
<?php use ZankoKhaledi\PhpSimpleRouter\Router; $baseUri = 'https://:8000'; $request = Router::assertRequest($baseUri) // config base uri for sending requests to server $request->assertGet($route,[]); // route like /foo $request->assertPost($route,[]); $request->assertPut($route,[]); $request->assertPatch($route,[]); $request->assertDelete($route,[]);
如果您熟悉PHPUnit测试框架和Guzzle/Http库,您可以在不使用路由器测试API的情况下测试您的API。
贡献
欢迎提交拉取请求。对于重大更改,请先打开一个问题来讨论您想要更改的内容。
请确保根据需要更新测试。