路由是一个框架中必不可少的组件,它的作用是按照预定的规则将URL解析到特定的控制器。我们在这里定义了两条路由规则:querystring。路径后用问号加参数,多个参数用&隔开。在配置文件中使用querystring来表示#controller/method?Parameter1=value1¶meter2=value2http://domain/user/info?name=php&chapter=10路径,将参数和值以路径的形式添加到后面,中间用/隔开。在配置中,使用restful#controller/method/parameter1/value1/parameter2/value2https://domain/user/info/name/php/chapter/100主控制器在core目录下创建Controller.php,该类继承Containermethod=$_SERVER['REQUEST_METHOD']??'得到';$this->uri=$_SERVER['REQUEST_URI'];$this->path=$_SERVER['PATH_INFO'];}}常用$_SERVER字段$_SERVER['PATH_INFO']URL路径信息,如/user/info$_SERVER['REQUEST_METHOD']请求方式,如POST,GET$_SERVER['REQUEST_URI']完整URL,如/user/info?id=1&name=Lucy在start()方法start(){/***Config::get('default.route','querystring');**/$route=Config::get('default.route')??'请求参数';//解析控制器求和动作$path=explode('/',trim($this->path,'/'));if(empty($path[0])){$path[0]=Config::get('default.controller','index');}$controller=ucfirst($path[0]).'Controller';($path[1]??Config::get('default.action','index'));call_user_func_array([$this,$route],[$this->uri]);}return['controller'=>$controller,'action'=>$action,'args'=>$args];}querystring()参与分析privatefunctionquerystring($url){$urls=explode('?',$网址);如果(empty($urls[1])){返回[];}$param_arr=[];$param_tmp=explode('&',$urls[1]);如果(空($param_tmp)){返回[];oreach($param_tmpas$param){if(strpos($param,'=')){列表($key,$value)=explode('=',$param);//变量名是否为复合规则if(preg_match('/^[A-Za-z_][A-Za-z0-9_]*$/',$key)){$param_arr[$key]=$值;}}}return$param_arr;}querystring参数是?后面的部分,多个参数用&restful()参数解析privatefunctionrestful($url){$path=explode('/',trim(explode('?',$url)[0],'/'));$参数=[];$i=2;while(1){if(!isset($path[$i])){中断;$params[$path[$i]]=$path[$i+1]??'';$i=$i+2;}return$params;}restful参数是方法后面的路径。完整代码如下:method=$_SERVER['REQUEST_METHOD']??'得到';$this->uri=$_SERVER['REQUEST_URI'];$this->path=$_SERVER['PATH_INFO'];}protectedfunctionstart(){$route=Config::get('default.route')??'请求参数';//解析控制器和动作$path=explode('/',trim($this->path,'/'));如果(空($path[0])){$path[0]=Config::get('default.controller','index');}$controller=ucfirst($path[0]).'Controller';//获取请求方法$method=strtolower($this->method);$action=$method.ucfirst($path[1]??Config::get('default.action','index'));//获取参数$args=[];如果(method_exists($this,$route)){$args=call_user_func_ar射线([$this,$route],[$this->uri]);}返回['controller'=>$controller,'action'=>$action,'args'=>$args];}/***查询字符串参数*?之后参数之间用&&**/privatefunctionquerystring($url){$urls=explode('?',$url);如果(empty($urls[1])){返回[];}$param_arr=[];$param_tmp=explode('&',$urls[1]);如果(空($param_tmp)){返回[];}foreach($param_tmpas$param){if(strpos($param,'=')){list($key,$value)=explode('=',$param);//变量名是否为复合规则if(preg_match('/^[A-Za-z_][A-Za-z0-9_]*$/',$key)){$param_arr[$key]=$值;}}}返回$param_arr;}/***路径参数*controller/method/parameter1/value1/Parameter2/Value2**/http://domain/user/info/name/entner?name=php&chapter=10私有函数restful($url){$path=explode('/',trim(explode('?',$url)[0],'/'));$参数=[];$i=2;while(1){if(!isset($path[$i])){中断;$params[$path[$i]]=$path[$i+1]??'';$i=$i+2;}返回$参数;}}路由调用方法为['controller'=>'index','action'=>'index','route'=>'querystring',//也可以设置为restful],'view'=>['dir'=>'layout','file'=>'base',]];在core/Application.php文件中,run()方法实现了路由调用';print_r($router);}...启动PHP内置服务器$cdtinyphp/public$php-Slocalhost:8080在浏览器中输入http://localhost:8080/course/document?name=php&&chapter=10输出结果为Array([controller]=>CourseController[action]=>getDocument[args]=>Array([name]=>php[chapter]=>10))同样可以测试restful路由规则在路由分析后调用controller方法,得到需要调用的控件的设备名称、方法和参数。由于controller继承了distributor,可以通过register()获取实例,编辑core/Applicaiton.php
