macleen/mcl-router

轻量级 PHP 路由器

dev-main 2023-01-30 12:46 UTC

This package is auto-updated.

Last update: 2024-09-29 05:49:15 UTC


README

轻量级 PHP 路由器包(版本 1.0 补丁 1)

简介

Mcl-Router 是一个小型 PHP 库,旨在用于/集成到您的应用程序中

使用说明

  • 重要\

请在您的根 composer.json 文件中插入以下两个标志

   {
      "here are the various flags of the":"composer.json file",
      "minimum-stability": "dev",
      "prefer-stable": true
   }

一般说明

我对现有的(非框架基础)PHP 路由器有些不满

  • 布局
    大多数现有库使用与流行的框架(如 slim 或 laravel)中使用的常见布局略有不同的布局。这意味着如果您习惯于使用框架,但需要一个快速轻量级的路由器用于非框架包,您将陷入所选包强加的布局,这通常与您习惯的不同...因此,您必须深入研究源代码来学习如何使用它。

  • 在控制器方法中使用 @
    如果您选择集成像 FastRoute 这样的包,您必须使用完全合格的 PHP 函数作为路由回调,例如 get('/home', function(){....}) 或 get('/home', [controller, method]),并在代码顶部声明控制器命名空间的使用。您不能使用以下标记 controller@method

  • 路由服务提供者
    如果您的包包含路由文件,例如( api.php, web.php, admin.php...等等),则这些文件将自动由 RouteServiceProvider.php(路由服务提供者)以组的形式处理,文件名作为前缀(除了 web.php => 默认为 '/')。此服务提供者必须在您的包中早期实例化(通过服务容器或手动,如果您的包不使用其中一个)。

包外部依赖

该库依赖于以下外部包

  • Illulintate/Collections/
    轻量级使用,以便更好地处理数组

  • Illulintate/Support/
    轻量级使用,以便更好地处理字符串

  • Symphony/HttpFoundation
    任何 PSR7 兼容的响应/请求包都适用。我选择了 symphony,因为它是使用最广泛的之一

包文件(内容)

该包包含以下文件夹

  • src/
    包含主要包文件

  • src/Requests
    此文件夹包含一个 AdaptedRequest 类,它扩展了 Symphony Request 类,以便更容易使用

实例化

  • MclRouter / 文件:Router.php
    这是主要的包类。它负责使用 RouteServiceProvider 注册单独文件中预定义的路由组(web.php、api.php、admin.php...等等)。它接受两个参数,路由路径:字符串数组 $route_definition_paths:以字符串形式 '/path/subpath1/subpath2/web.php' 的路由定义文件路径,如果您只有一个路由文件,或者以数组形式 ['/path/subpath1/subpath2/web.php','/path/subpath1/subpath2/api.php'] 如果有多个,控制器命名空间数组(您的控制器在其中定义)。
    use MclRouter\Router;
    $router = new Router( string|array $route_definition_files, ?array $controllers_name_spaces = [ ]);
  • 路由定义
    如果您的应用程序包含多个部分(例如,网页部分、API 部分、管理员部分),请为每个部分使用单独的路由文件。根据包含它们的文件,将自动分配路由前缀。例如,假设您在 '/path/subpath1/subpath2/api.php' 中定义了一个 API 路由文件,所有 HTTP 请求必须以 /api/path/... 开头才能进入此文件。API.php 文件中的定义不需要包含前缀。
//This is the api.php routes file

use MclRouter\Route;
use MclRouter\RouteGroup;


Route::get('/', 'HomeController@index');
Route::post('/provider/upload', 'UploadController@upload_files');

#------------------------------------------------------------------

Route::group('/user/{id}', function( RouteGroup $group ){
        $group->get('/', 'UserListController@get');
        $group->get('/state', 'UserStatesController@index');
        $group->delete('/', 'UserMainController@delete');
});

路由参数

  • 命名路由

您可以为路由命名以便稍后通过名称检索,只需将名称函数链接到 Route::{method},如下所示

Route::get('/home', 'HomeController@index')->name('home');
Route::post('/data/save', 'DataController@save')->name('save');
  • 变量参数

变量参数用花括号 {} 括起来,如下所示

Route::get('/user/{id}', 'UserController@get')->name('home');
Route::post('/save/{release_id}', 'DataController@save')->name('save');
  • 可选参数

可选参数用花括号和问号括起来,问号附加在参数名称的末尾,在关闭的 "}" 前面

Route::get('/user/{id?}', 'UserController@get')->name('get_user_by_id');
Route::post('/save/{release_id?}', 'DataController@save')->name('save_release');
  • 带有必需参数的正则表达式

可以通过链式 where 函数将正则表达式验证规则附加到静态 Route::{method}

Route::get('/user/{id}', 'UserController@get')
     ->name('get_user_by_id')
     ->where(['id' => '[a-zA-Z]{2}[\d]{6}']);

   // id must start with 2 alpha characters followed by 6 digits
  • 带有可选参数的正则表达式

允许使用带有可选参数的正则表达式验证规则。这意味着如果省略参数,则路由将被处理,但如果提供参数,则必须匹配正则表达式

Route::get('/user/{id?}', 'UserController@get')
     ->name('get_user_by_id')
     ->where(['id' => '[a-zA-Z]{2}[\d]{6}');

   // id is optional but if supplied it must start with 2 alpha characters followed by 6 digits

控制器函数调用

为特定路由提供的每个函数在路由匹配时将自动调用,并自动注入两个参数

use MclRouter\Requests\AdaptedRequest;
use MclRouter\RouteParams;


Route::get('/user/{id?}', 'UserController@get');
Route::post('/{id}', 'UserController@save');

class UserController {

   function get( RouteParams $parms ){

      $id = $parms->id;
      // some logic here
      return $something;

   }

   function save( RouteParams $parms, AdaptedRequest $req ){

      $id = $parms->id;
      $data = $req->all( ); // this is the post data
      // some logic here
      return $something;

   }

}


// OR USING A CLOSURE INSTEAD OF A CONTROLLER


Route::get('/user/{id?}', function( RouteParams $parms, AdaptedRequest $req ){
   // some logic here
   // response can be an instance of Symphony response class or 
   // string or 
   // array : ( will be json serialized )
   return (mixed) $response;
});

重要使用说明

  • 向基础 URL 发送 POST 请求\

这是一个 PHP/Http 问题。假设您的域名托管在 https://pizza.com/ingredients/classes(基础 URL),如果您针对该 URL 发起 POST 请求(在表单提交之外),请确保以斜杠结尾,如下所示 https://pizza.com/ingredients/classes/。在 https://stackoverflow.com/questions/18371009/serverrequest-method-return-get-insted-post 中检查此问题

//And the route defnition must also respect that rule

Route::post('/ingredients/classes/', 'UploadController@upload_files');

启动

  • 主索引文件这是 index.php 文件的示例。假设您的默认命名空间是 app,并且存在一个用于显示最终响应的 Viewer 类
    require __DIR__ . '/vendor/autoload.php';
    #------------------------------------------------------------------------
    $routes = [ __DIR__ . '/routes/api.php', __DIR__ . '/routes/web.php' ];

    (new App\Render\Viewer( ))
       ->render(( new MclRouter\Router( $routes, [ '\\App\\Controllers\\' ]))
       ->dispatch( ));

安装

composer require macleen/mcl-router

作者:C. Mahmoud / MacLeen 2023 v 1.0.1 / 邮箱:acutclub@gmail.com
有关错误、建议或其他信息,请通过我的邮箱联系我。