#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
控制器不存在
```