Skip to content

lejianwen/route

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

25 Commits
 
 
 
 
 
 
 
 

Repository files navigation

一个简单的路由工具

安装

composer require "ljw/route": "dev-master"

使用方式

use \Ljw\Route\Route;
// 第一个参数是uri, 最后一个是controller, 中间的都为中间件
Route::$method($uri, $controller);
Route::$method($uri, $middleware, $controller);

基本使用

use \Ljw\Route\Route;

Route::get('', 'app\\controllers\\IndexController@index');

Route::post('index/test', 'app\\middleware\\Index', 'app\\controllers\\IndexController@test');

Route::post('index/test2/(:str)/(:num)', 'app\\middleware\\Index', 'app\\controllers\\IndexController@test2');
Route::post('index/test2/(:str)/(:num)', 
function($params, $next)
{
    // todo 前置方法
    $next($params); // 如果这个不写则在此处中断
    // todo 后置方法
}, 'app\\controllers\\IndexController@test2');

1.中间件如果是类要实现Middleware接口,或者有handle方法

namespace app\middleware;

use Ljw\Route\Middleware;

class Index implements Middleware
{
    public function handle($params, $next)
    {
        // todo 前置方法
        $next($params); // 如果这个不写则在此处中断
        // todo 后置方法
    }
}

2.如果中间是闭包则和handle方法一样,需要接收2个参数

function($params, $next)
{
        // todo 前置方法
        $next($params); // 如果这个不写则在此处中断
        // todo 后置方法
}

3.控制器中可通过参数获取到匹配的值

namespace app\controllers;

class IndexController
{
    public function test()
    {
        echo 'ok';
    }

    public function test2($str, $num)
    {
        var_dump($str, $num);
    }
}

命名空间自定义

如果传入的中间件和控制是字符串, 则会自动加上命名空间

use \Ljw\Route\Route;
//定义控制器和中间件的命名空间
Route::space('app\\controllers\\', 'app\\middleware\\'); 

Route::get('', 'IndexController@index');

Route::post('index/test', 'Index@test', 'IndexController@test');

通过中间件批量添加路由

use \Ljw\Route\Route;

Route::middleware('app\\middleware\\Index',
    function () {
        Route::get('/',  'IndexController@test');
    }
);
//定义控制器和中间件的命名空间
Route::space('app\\controllers\\', 'app\\middleware\\'); 
Route::middleware(['Index', 'Index'],
    function () {
        Route::get('/',  'IndexController@test');
    }
);
Route::middleware('Index',    function () {
        Route::get('/',  'IndexController@test');
    }
);

使用闭包

use \Ljw\Route\Route;
//定义控制器和中间件的命名空间
Route::get('', function (){
    echo 'index';
});

Route::get('index/index/(:str)/(:num)',function($params, $next)
                                       {
                                               // todo 前置方法
                                               $next($params); // 如果这个不写则在此处中断
                                               // todo 后置方法
                                       },
 function ($str, $num) {
    var_dump($str, $num);    //结果为 middle
});

错误处理

use \Ljw\Route\Route;
//错误处理
Route::error(function (){
     http_response_code(404);
     echo '404 Not Found!';
});
//或者
Route::error('app\\controllers\\IndexController@error');

使用正则匹配

//正则匹配支持的方式
 $patterns = [
        ':any' => '[^/]+',
        ':str' => '[0-9a-zA-Z_]+',
        ':num' => '[0-9]+',
        ':all' => '.*'
 ];
// 也可以通过\Ljw\Route\Route::$patterns, 自行添加和修改
use \Ljw\Route\Route;
Route::space('app\\controllers\\', 'app\\middleware\\'); 
Route::get('index/(:num)', 'Index', 'IndexController@test');
//中间件
namespace app\middleware;

use Ljw\Route\Middleware;

class Index implements Middleware
{
    public function handle($params, $next)
    {
        // todo 前置方法
        $params[0]++;
        $next($params); // 如果这个不写则在此处中断
        // todo 后置方法
    }
}
//控制器
class IndexController{
    public function test($num)
    {
        echo $num;
    }
}
//GET /index/5 结果为6

TIPS

  1. 路由只有在匹配不到的时候才会匹配正则,正则如果也匹配不到则会调用error
use \Ljw\Route\Route;
Route::get('index/test', 'IndexController@test');
Route::get('index/(:str)', 'IndexController@index');
//GET /index/test时,会匹配第一条
  1. 相同的路由规则,后面的路由会覆盖前面的
use \Ljw\Route\Route;
Route::get('index/test', 'IndexController@test');
Route::get('index/test', 'IndexController@index');
//GET /index/test时,会匹配第二条
  1. 方式any中的路由优先级低于get,post等具体方式
use \Ljw\Route\Route;
Route::any('index/test', 'IndexController@any');
Route::get('index/test', 'IndexController@test');
Route::any('index/test', 'IndexController@index');
//GET /index/test时,会匹配第二条
//POST /index/test时,会匹配第三条

About

一个简单的路由工具

Topics

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages