本节我们就真正进入“从零构建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 |
{ "author":"minyifei", "web":"http://www.minyifei.cn", "teach":"从零构建php商用mvc框架" } |
到此本节的内容基本完成了,我也把本节课所涉及的代码发布到oschina的git上了,欢迎大家下载拍砖!
下载地址为:https://git.oschina.net/myfcms/mvc/tree/v2.1