從零構建PHP商用MVC框架(2.1 路由-帶參數請求)

本節咱們就真正進入「從零構建php商用mvc框架」的實際動手階段,本節的標題是「路由-帶參數請求」,咱們本節要構建最基本的mvc路由訪問控制,舉例如:minyifei.cn/?_c=test&_a=getInfo 能訪問咱們的TestController類的getInfo方法,並能正常輸出內容。 php

首先我給你們先看看最終的項目目錄結構是什麼樣子的,而後再逐個文件介紹: html

myfmvc路由目錄截圖

先看看index.php,你們都比較熟悉,這個是整個項目的入口,代碼也很簡單,僅作爲轉發器,代碼以下: git

1
2
3
4
5
6
7
<?php
/**
 * mvc 入口 index.php
 * User: www.minyifei.cn
 * Date: 15/4/23
 */
require_once'myf/myf.php';

而後咱們再看看mvc目錄下的functions.php,這個會寫一些全局使用的函數,方便咱們在各個業務模塊中使用,本節中咱們僅寫了兩個getUrlString和getMvcRoute,分別是獲取參數和獲取路由參數。functions.php的代碼以下: web

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?php
/**
 * mvc 系統函數 functions.php
 * User: www.minyifei.cn
 * Date: 15/4/23
 */
 
/**
 * 獲取純字符串
 * @param $name
 * @return null
 */
functiongetUrlString($name)
{
    $value= filter_input(INPUT_GET,$name, FILTER_SANITIZE_URL);
    if($value) {
        return$value;
    }else{
        returnnull;
    }
}
 
/**
 * mvc路由解析器,負責從參數中提取url路由信息
 */
functiongetMvcRoute(){
    //控制器
    $c= getUrlString("_c");
    //執行方法
    $a= getUrlString("_a");
    //默認訪問方法爲 index
    if(empty($a)){
        $a="index";
    }
    //默認控制器爲 index
    if(empty($c)){
        $c="index";
    }
    //路由
    $route=array(
        "_a"=>$a,
        "_c"=>$c,
    );
    //轉換 _c = 'ab_cd' 爲 _c='AbCd'
    $cs=explode("_",$c);
    for($index= 0;$index<count($cs);$index++) {
        $cs[$index] = ucfirst($cs[$index]);
    }
    $c= implode("",$cs);
    $route["a"]=$a;
    $route["c"]=$c;
    return$route;
}

咱們這塊定義參數路由控制器的訪問參數爲_c和_a,分別表明訪問控制器和方法,你們能夠根據本身的喜歡隨意改動。還有一個細微的處理,_c若是爲下劃線鏈接的字符串時我這邊會處理成駝峯訪問,如:_c=teacher_center&_a=detail其實會訪問TeacherCenterController的detail方法。 json

下面咱們再看看核心代碼myf.php,主要負責加載依賴的類庫,並進行簡單業務控制: 瀏覽器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
/**
 * mvc核心類庫 myf.php
 * User: www.minyifei.cn
 * Date: 15/4/23
 */
 
//設置時區
date_default_timezone_set('PRC');
//項目跟路徑
define('APP_PATH', dirname($_SERVER['SCRIPT_FILENAME']));
//項目相對目錄
define("SITE_PATH", dirname($_SERVER['SCRIPT_NAME']));
//系統配置路徑
define('APP_SYS_PATH', dirname(__FILE__));
define('APP_SITE_PATH', dirname(dirname(__FILE__)));
//引用全局函數
require_once(APP_SYS_PATH."/functions.php");
//獲取路由解析器
$route= getMvcRoute();
//控制器
$mvcController=$route["c"];
//執行方法
$mvcAction=$route["a"];
//控制器的命名規則爲:XxxController
$mvcControllerName=$mvcController."Controller";
//加載控制器文件
$mvcControllerFile= sprintf("%s/app/controller/%s.php",APP_PATH,$mvcControllerName);
if(file_exists($mvcControllerFile)){
    //加載基類controller
    require_onceAPP_SYS_PATH."/controller.php";
    require_once$mvcControllerFile;
    $myfC=new$mvcControllerName();
    //執行前置方法
    $myfC->_before_action();
    //執行用戶方法
    $myfC->{$mvcAction}();
    //執行後置方法
    $myfC->_after_action();
}else{
    echo"404 page not found";
}

代碼也比較簡單,並且備註也寫的比較清楚,若是有不懂的能夠留言,我會再針對行的解答!
咱們再看看myf目錄下的controller.php,如今這個類僅定義了個3個方法,兩個空方法和一個魔術方法,將來咱們不少模板引擎和系統參數都須要在這個類中初始化。 mvc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
/**
 * mvc核心類庫 controller.php
 * User: www.minyifei.cn
 * Date: 15/4/23
 */
classController{
 
    /**
     * action前執行的全局方法,可繼承並重構
     */
    publicfunction_before_action() {
 
    }
 
    /**
     * action後執行的全局方法,可繼承並重構
     */
    publicfunction_after_action() {
 
    }
 
    /**
     * 魔術方法
     * @param type $name
     * @param type $arguments
     */
    publicfunction__call($name,$arguments) {
        echo"error url 404";
    }
 
}

ok到此爲止,最簡易的訪問控制器核心代碼已經完成,下面咱們建立兩個控制器作個測試:
首先默認的控制器是app/controller/IndexController.php文件,默認的方法是index方法。 app

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
/**
 * 首頁 IndexController.php
 * User: minyifei
 * Date: 15/4/23
 */
 
classIndexControllerextendsController{
 
    //首頁默認方法
    publicfunctionindex(){
        echo"Hello minyifei,I'm Index->index";
    }
 
    //測試方法
    publicfunctionhello(){
        echo"Hello minyifei, I'm Index->hello";
    }
}

咱們經過訪問 minyifei.cn 會觸發IndexController.php的index方法,瀏覽器會輸出: 框架

1
Hello minyifei,I'm Index->index

若是訪問 minyifei.cn?_a=hello,則會觸發IndexController.php的hello方法,瀏覽器會輸出: 函數

1
Hello minyifei, I'm Index->hello
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
/**
 * 測試 TestController.php
 * User: minyifei
 * Date: 15/4/23
 * Time: 下午2:15
 */
 
classTestControllerextendsController{
 
    //測試返回json對象
    publicfunctiongetInfo(){
        $info=array(
            "author"=>"minyifei",
            "web"=>" http://www.minyifei.cn",
            "teach"=>"從零構建php商用mvc框架",
        );
        header('Content-Type:application/json; charset=utf-8');
        echojson_encode($info);
    }
 
}

TestController.php是一個輸出json的例子,咱們訪問 minyifei.cn?_c=test&_a=getInfo頁面會輸出

1
2
3
4
5
{
 "author":"minyifei",
 "teach":"從零構建php商用mvc框架"
}

到此本節的內容基本完成了,我也把本節課所涉及的代碼發佈到oschina的git上了,歡迎你們下載拍磚!
下載地址爲:https://git.oschina.net/myfcms/mvc/tree/v2.1

相關文章
相關標籤/搜索