当前位置: 首页 > 后端技术 > PHP

PHP的单文件路由

时间:2023-03-29 16:42:20 PHP

inhere/sroute是一个非常轻量级的单文件路由。简洁且高度可定制的referrer项目noahbuschermacaw,但添加了一些功能。支持请求方式:GETPOSTPUTDELETEHEADOPTIONS支持事件:foundnotFound。你可以在事件触发时做一些事情(比如记录日志等)支持设置匹配路由解析器:SRoute::setMatchedRouteParser()。您可以自定义如何调用匹配的路由处理程序。和yii一样支持路由自动匹配控制器,参考配置项autoRoute。支持通过方法SRoute::dispatchTo()手动调度路由也可以什么都不配置也能正常运行Install{"require":{"inhere/sroute":"dev-master"}}使用先导入该类在这里使用\sroute\SRoute;添加路由//匹配GET请求。Processor是一个闭包ClosureSRoute::get('/',function(){echo'hello';});//匹配参数'test/john'SRoute::get('/test/(\w+)',function($arg){echo$arg;//'john'});//匹配POST请求SRoute::post('/user/login',function(){var_dump($_POST);});//匹配GETorPOSTSRoute::map(['get','post'],'/user/login',function(){var_dump($_GET,$_POST);});//允许任何请求方法SRoute::any('/home',function(){echo'你好,你请求的页面是/home';});如果配置'ignoreLastSep'=>true,'/index'等同于'/index/'使用控制器方法SRoute::get('/index','app\controllers\Ho我@index');动态匹配控制器方法要动态匹配控制器方法,需要配置'dynamicAction'=>true注意:要使用动态匹配控制器方法,您应该使用any()添加路由。即此时不能限制请求方法REQUEST_METHOD//访问'/home/test'会执行'app\controllers\Home::test()'SRoute::any('/home/(\w+)',app\controllers\Home::class);//可以匹配'/home','/home/test'等SRoute::any('/home(/\w+)?',app\controllers\Home::班级);上面两个的区别是第一个不能匹配/home使用方法执行器,将actionExecutor配置为你需要的方法名,比如配置为'actionExecutor'=>'run',那么所有的方法请求将提交给这个方法,真正的动作名称将作为参数传递给run($action),你需要在这个方法中调度以执行真正的请求方法。当您需要将路由器集成到您的框架中时很有用示例://访问'/user',将调用app\controllers\User::run('')SRoute::get('/user','app\controllers\User');//访问'/user/profile',会调用app\controllers\User::run('profile')SRoute::get('/user/profile','app\controllers\User');//配置'actionExecutor'=>'run'和'dynamicAction'=>true,//访问'/user',将调用app\controllers\User::run('')//访问'/user/profile',将调用app\controllers\User::run('profile')SRoute::get('/user(/\w+)?','app\controllers\User');自动匹配路由到控制器和yii一样支持自动匹配路由到控制器,需要配置autoRoute。'autoRoute'=>['enable'=>1,//启用'controllerNamespace'=>'examples\\controllers',//控制器类命名空间'controllerSuffix'=>'Controller',//控制器类后缀],match所有配置'matchAll'可用于拦截所有请求。(比如网站维护时)允许配置'matchAll'的值为routepath'matchAll'=>'/about'//一个routepath会直接执行这条route。Callback'matchAll'=>function(){echo'系统维护中......';},会直接执行这个回调来设置事件处理(如果需要的话)SRoute::any('/404',function(){echo"Sorry,Thispage{$_GET['path']}notfound.";});//成功匹配路由SRoute::on(SRoute::FOUND,function($uri,$cb)use($app){$app->logger->debug("匹配的uri路径:$uri,settingcallbackis:".is_string($cb)?$cb:get_class($cb));});//匹配失败时,重定向到'/404'SRoute::on('notFound','/404');//或者,当匹配失败时,输出信息...SRoute::on('notFound',function($uri){echo"thepage$urinotfound!";});设置配置(如果需要)//设置configSRoute::config(['stopOnMatch'=>true,'ignoreLastSep'=>true,'dynamicAction'=>true,//'matchAll'=>'/',//aroutepath//'matchAll'=>function(){//echo'SystemMaintaining......';//},//启用自动路由,像yii框架一样工作//你可以访问'/demo''/admin/user/info',不需要配置任何路由'autoRoute'=>['enable'=>1,'controllerNamespace'=>'examples\\controllers','controllerSuffix'=>'Controller',],]);默认配置如下//所有的默认配置[//停止匹配。只匹配一个'stopOnMatch'=>true,//过滤`/favicon.ico`请求。'filterFavicon'=>false,//忽略最后一个'/'字符。如果为True,将清除最后一个'/',因此'/home'等于'/home/''ignoreLastSep'=>false,//匹配所有请求。//1.如果是有效的URI路径,会将所有请求uri匹配到该路径。//2.如果是可调用的,将匹配所有请求然后调用它'matchAll'=>'',//例如:'/site/maintenance'或`function(){echo'SystemMaintaining......';}`//自动路由匹配@likeyiiframework'autoRoute'=>[//如果为True,将自动找到处理程序控制器文件。'enable'=>false,//默认的controllers命名空间,当`'enable'=true`时有效'controllerNamespace'=>'',//eg:'app\\controllers'//控制器后缀,当`'enable'=true`时有效'controllerSuffix'=>'',//eg:'Controller'],//默认操作方法名称'defaultAction'=>'index',//启用动态操作。//例如//如果设置为True;//SRoute::any('/demo/(\w+)',app\controllers\Demo::class);//你访问'/demo/test'将调用'app\controllers\Demo::test()''dynamicAction'=>false,//动作执行器。将自动调用控制器的执行器方法来运行所有操作。//例如//`run($action)`//SRoute::any('/demo/(:act)',app\controllers\Demo::class);//你访问`/demo/test`将调用`app\controllers\Demo::run('test')`'actionExecutor'=>'',//'run']注意:必须使用SRoute::config在调用SRoute::dispatch()()进行一些配置并开始路由分发之前SRoute::dispatch();运行示例你可以通过bash运行一个测试服务器./php_server,现在你可以访问http://127.0.0.1:5670项目地址githubgit@osc