ween / 输送带
PHP 路由器,支持简单的路由分组功能。
1.0
2019-03-13 06:27 UTC
Requires
- php: >=5.3.3
This package is auto-updated.
Last update: 2024-09-12 13:37:25 UTC
README
简介
Conveyor 是一个 PHP 路由器,支持路由分组功能。
特性
初始时注册可用的 URI 前缀、类命名空间和中间件;
在每个路由分组中设置不同的路由前缀和命名空间;
为每个路由设置简单的中间件。
安装
如果您有 Composer,只需在您的 composer.json 中将其作为项目依赖项即可。如果没有,只需下载 .ZIP 文件并将其解压到您的项目目录中。
require: {
"ween/conveyor": "dev-master"
}
或者命令行
composer require ween/conveyor
用法
首先,使用 use
路由命名空间
use Conveyor\Route;
其次,编写路由(编写风格类似于 Laravel)
基本用法
Route::get('/', function() { return 'GET request'; }); Route::post('/', function() { return 'POST request'; }); Route::any('/', function() { return 'both GET and POST request'; }); Route::get('/', 'DemoControllers@method');
最后,分发请求或仅捕获请求
单次使用
// Will dispatch routes, run the middlewares and finally call the matched method Route::dispatch();
容器中使用
// Capture the matched array, which include class names of all middlewares and the matched method Route::capture();
您还可以在路由中使用正则表达式,现在可以识别三个。
Route::get('/a/(:all)b/ab', function() { return 'I can receive all request uri like /a/abcb/ab, /a/123b/ab, /a/b/c/db/ab'; }); Route::get('/a/(:any)b/ab', function() { return 'I can receive all request uri like /a/ab/ab, /a/4b/ab, /a/a4b/ab'; }); Route::get('/a/(:num)b/ab', function() { return 'I can receive all request uri like /a/0123456789b/ab'; });
路由分组功能
/** * $params recognize three keywords now: * $params['prefix'] set a prefix uri for current group; * $params['namespace'] set the namespace for current group, so that class can be autoloaded with PSR-4; * $params['middleware'] set some registered middlewares before call final function. */ Route::group(array $params, closure $callback);
Route::group(['prefix' => '/user', 'namespace' => 'App\\Controller\\'], function() { Route::group(['prefix' => '/sub1', 'namespace' => 'Bpp\\Controller\\', 'middleware' => 'foo, bar'], function() { Route::get('/', function() { return 'I can receive uri like /user/sub1'; }); // Request /user/sub1/abc will load class DemoController in namespace Bpp\\Controller\\ // Middleware will not work because no registered middleware exist. Route::get('/abc', 'DemoController@method'); }); Route::group(['prefix' => '/sub2'], function() { Route::get('/', function() { return 'I can receive uri like /user/sub2/'; }); Route::get('/a(:all)', function() { return 'I can receive all request uri start with /user/sub2/a'; }); }); });
如果您不需要中间件功能,上述代码就足够了。如果不,请参阅下面的扩展。
扩展
Conveyor 提供了一些有用的函数。
注册一些常用属性
注册需要在编写路由之前调用。
Route::register([ 'prefix' => '', 'namespace' => 'App\\Controllers\\', 'alias' => [ // Middleware path array // 'alias' => \Namespace\Class::class; 'abc' => \Foo\Bar\FB::class, 'home' => \App\Middlewares\HomeMiddleware::class, ], // Just registered alias are valid; 'middleware' => 'abc, home' ]);
重写路由分发失败时的 404 通知
Route::error(function() { return '404 :: Not Found'; });
为单个路由设置一些中间件
Route::get('abc', 'HomeController@demo')->middleware('foo, bar');
中间件示例
yourRoute.php
<?php use Conveyor\Route; Route::register([ 'namespace' => 'App\\Controllers\\', 'alias' => [ 'home' => \App\Middlewares\HomeMiddleware::class, ] ]); // some routes... Route::get('abc', 'HomeController@demo')->middleware('home');
HomeMiddleware.php
Conveyor 会运行中间件为 HomeMiddleware->handle(); 所以每个中间件都需要一个
handle()
方法。
<?php namespace App\Middlewares; class HomeMiddleware { public function handle() { // $result = 'result of your milldeware validation'; if ($result) { // if validate success, just return true return true; } else { // if failed ,please give a response array // [some fields...] return ['result' => 'error', 'msg' => 'error message']; } } }