文档章节

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

feiyue
 feiyue
发布于 2015/04/25 14:42
字数 1391
阅读 518
收藏 27

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

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

myfmvc路由目录截图

先看看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",
 "teach":"从零构建php商用mvc框架"
}

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

本文转载自:http://www.minyifei.cn/archives/65.html

共有 人打赏支持
feiyue

feiyue

粉丝 12
博文 11
码字总数 366
作品 2
东城
程序员
私信 提问
从零构建PHP商用MVC框架(1.引言)

“从零构建php商用mvc框架”系列教程,会使大家熟练掌握mvc模式,开发属于自己商用php应用。 作者(闵益飞)在互联网行业打拼已经有6年时间,接触的系统产品不下几十种,大多数常用的服务器语...

feiyue
2015/04/25
0
1
ASP.NET Core 入门教程 3、ASP.NET Core MVC路由入门

一、前言 1、本文主要内容 ASP.NET Core MVC路由工作原理概述 ASP.NET Core MVC带路径参数的路由示例 ASP.NET Core MVC固定前/后缀的路由示例 ASP.NET Core MVC正则表达式匹配路由示例 ASP....

ken的杂谈
09/26
0
0
微型 PHP 框架--FocusPHP

FocusPHP FocusPHP is a micro php framework TODO 完善docker开发环境 增加后台管理 框架与项目分离 完善单元测试,使用Travis CI持续集成 备注 数据库文件中,username=admin, password=ad...

mylxsw
2015/10/30
535
0
YurunPHP 2.2.1 终结版,支持 Composer 引入

距离2.1版本的发布过了5个月,这次2.2重磅支持了Composer,并且带来了38项改进。 YurunPHP是一个喜闻乐见烂大街的PHP MVC开发框架,也不多介绍了,该有的功能都有了。 这个框架的起源在2013年...

宇润
2017/10/25
1K
16
讲一下Asp.net core MVC2.1 里面的 ApiControllerAttribute

先贴文章链接 正文 ASP.NET Core MVC 2.1 特意为构建 HTTP API 提供了一些小特性,今天主角就是 . (注:文章是18年2月份的,所以文章提到了core2.1还没发布)。 0. ApiControllerAttribute ...

Sheldon_Lou
08/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Ubuntu16.04下安装docker

[TOC] 本文开发环境为Ubuntu 16.04 LTS 64位系统,通过apt的docker官方源安装最新的Docker CE(Community Edition),即Docker社区版,是开发人员和小型团队的理想选择。 1. 开始安装 1.1 由于...

豫华商
今天
9
0
使用XShell工具密钥认证登录Linux系统

如果你是一名Linux运维,那么Linux服务器的系统安全问题,可能是你要考虑的,而系统登录方式有两种,密码和密钥。哪一种更加安全呢? 无疑是后者! 这里我为大家分享用Xshell利器使用密钥的方...

dragon_tech
今天
7
0
day178-2018-12-15-英语流利阅读-待学习

“真蛛奶茶”了解一下?蜘蛛也会产奶了 Lala 2018-12-15 1.今日导读 “蛋白质含量是牛奶的 4 倍,并有着更低的脂肪和含糖量”,听起来诱人又美味的并不是羊奶或豆奶,而是你可能打死都想不到...

飞鱼说编程
今天
11
0
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents

场景重现 npm install --verbose 安装依赖的时,出现如下警告 强迫症患者表示不能接受 npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.4 (node_modules\fsevents):npm WARN......

taadis
今天
2
0
OSChina 周六乱弹 —— 你一口我一口多咬一口是小狗

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @达尔文 :分享Roy Orbison的单曲《She's a Mystery to Me》 《She's a Mystery to Me》- Roy Orbison 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
今天
452
6

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部