Maison >développement back-end >tutoriel php >从零构建PHP商用MVC框架(2.1 路由-带参数请求)

从零构建PHP商用MVC框架(2.1 路由-带参数请求)

WBOY
WBOYoriginal
2016-06-23 13:36:00958parcourir

本节我们就真正进入“从零构建php商用mvc框架”的实际动手阶段,本节的标题是“路由-带参数请求”,我们本节要构建最基本的mvc路由访问控制,举例如:minyifei.cn/?_c=test&_a=getInfo 能访问我们的TestController类的getInfo方法,并能正常输出内容。

首先我给大家先看看最终的项目目录结构是什么样子的,然后再逐个文件介绍:

先看看index.php,大家都比较熟悉,这个是整个项目的入口,代码也很简单,仅做为转发器,代码如下:

帮助

1

2

3

4

5

6

7

/**

 * mvc 入口 index.php

 * User: www.minyifei.cn

 * Date: 15/4/23

 */

require_once'myf/myf.php';

然后我们再看看mvc目录下的functions.php,这个会写一些全局使用的函数,方便我们在各个业务模块中使用,本节中我们仅写了两个getUrlString和getMvcRoute,分别是获取参数和获取路由参数。functions.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

43

44

45

46

47

48

49

50

51

52

53

/**

 * 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

        $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方法。

下面我们再看看核心代码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

/**

 * 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个方法,两个空方法和一个魔术方法,未来我们很多模板引擎和系统参数都需要在这个类中初始化。

帮助

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

/**

 * 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方法。

帮助

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

/**

 * 首页 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

/**

 * 测试 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",

 "web":" http://www.minyifei.cn",

 "teach":"从零构建php商用mvc框架"

}

到此本节的内容基本完成了,我也把本节课所涉及的代码发布到oschina的git上了,欢迎大家下载拍砖!
下载地址为:

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn