从零构建PHP商用MVC框架(2.1 路由-带参数请求)
本节我们就真正进入“从零构建php商用mvc框架”的实际动手阶段,本节的标题是“路由-带参数请求”,我们本节要构建最基本的mvc路由访问控制,举例如:minyifei.cn/?_c=test&_a=getInfo 能访问我们的TestController类的getInfo方法,并能正常输出内容。
首先我给大家先看看最终的项目目录结构是什么样子的,然后再逐个文件介绍:
先看看index.php,大家都比较熟悉,这个是整个项目的入口,代码也很简单,仅做为转发器,代码如下:
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的代码如下:
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方法。
下面我们再看看核心代码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个方法,两个空方法和一个魔术方法,未来我们很多模板引擎和系统参数都需要在这个类中初始化。
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方法。
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
|
到此本节的内容基本完成了,我也把本节课所涉及的代码发布到oschina的git上了,欢迎大家下载拍砖!
下载地址为:https://git.oschina.net/myfcms/mvc/tree/v2.1
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。