zanko-khaledi/php-simple-router

2.0.1 2023-08-17 06:01 UTC

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。

贡献

欢迎提交拉取请求。对于重大更改,请先打开一个问题来讨论您想要更改的内容。

请确保根据需要更新测试。

许可证

MIT