🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
#6.URL路由之重写URL路由 刚才已经成功获取到了url,然后我们要对url进行解析,我们建立一个新的类文件来处理,这个类文件要实现的功能是:得到控制器的名称、得到方法名、其他参数并保存。组装得到控制器的路径,判断控制器文件是否存在,存在则实例化,然后判断方式是否存在,存在则执行方法,如果控制器文件或者方法不存在则执行相应地异常报错。 ```cpp |-core | |-App.class.php URL重写类 <?php /** * Created by PhpStorm. * User: find35.com * Date: 15/12/25 * Time: 上午10:53 */ class App { protected static $controller = 'Home';//控制器名 protected static $method = 'index';//方法名 protected static $pams = array();//其他参数 /** * url重写路由的url地址解析方法 */ protected static function paseUrl(){ if(isset($_GET['url'])){ $url = explode('/',$_GET['url']); //得到控制器 if(isset($url[0])){ self::$controller = $url[0]; unset($url[0]); } //得到方法名 if(isset($url[1])){ self::$method = $url[1]; unset($url[1]); } //判断是否有其他参数 if(isset($url)){ self::$pams = array_values($url); } } } /** * 项目的入口方法 * @throws Exception */ public static function run(){ self::paseUrl(); //得到控制器的路径 $url = 'app/controllers/'.self::$controller.'.class.php'; //判断控制器文件是否存在 if(file_exists($url)){ $c = new self::$controller; }else{ throw new Exception('控制器不存在'); } //执行方法 if(method_exists($c,self::$method)){ $m = self::$method; $c->$m(); }else{ throw new Exception('方法不存在'); } } } ``` 在入口文件这里,我们要在执行run方法,并捕获异常情况,如有异常则输出 ```cpp |-index.php 项目前台入口文件,单一入口 <?php /** * Created by PhpStorm. * User: find35.com * Date: 15/12/24 * Time: 下午5:15 */ echo "<meta charset='utf-8'>"; require_once 'core/App.class.php'; require_once 'app/controllers/Test.class.php'; require_once 'app/controllers/Home.class.php'; try{ App::run(); throw new Exception(); }catch(Exception $e){ echo $e->getMessage(); } ``` 此时我们在浏览器中输入 ```cpp http://localhost/php_mvc/home/index/id/13 ``` 那么在浏览器中展示如下,表示成功 ```cpp 这里是home控制器里的index方法 ``` 如果我们在浏览器中输入一个不存在的控制器,比如 ```cpp http://localhost/php_mvc/article/index/id/13 ``` 那么在浏览器将中展示出异常信息 ```cpp 控制器不存在 ```