macleen / mcl-router
轻量级 PHP 路由器
Requires
- php: >=8.0
- illuminate/collections: ^9.43
- illuminate/support: ^9.48
- symfony/http-foundation: ^6.2
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
有关错误、建议或其他信息,请通过我的邮箱联系我。