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