从零构建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

{

"author":"minyifei",

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

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

}

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

下载地址为:https://git.oschina.net/myfcms/mvc/tree/v2.1

时间: 2024-08-10 15:15:17

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

BrnShop开源网上商城第二讲:ASP.NET MVC框架

在团队设计BrnShop的web项目之初,我们碰到了两个问题,第一个是数据的复用和传递,第二个是大mvc框架和小mvc框架的选择.下面我依次来说明下. 首先是数据的复用和传递:对于BrnShop的每一次请求,程序都要分成好几个阶段执行,例如验证,执行动作方法等等,在各个阶段我们可能需要重复使用同一信息,而我们的愿景就是希望此信息只需获取一次,然后沿着流程管道一直流动,这样在后面的阶段中就可以直接使用,不用再重新获取了,提高程序的性能.举例来说:在授权验证阶段,我们为对用户进行验证,从而获取了用户

通过极简模拟框架让你了解ASP.NET Core MVC框架的设计与实现[上篇]

<200行代码,7个对象--让你了解ASP.NET Core框架的本质>让很多读者对ASP.NET Core管道有了真实的了解.在过去很长一段时间中,有很多人私信给我:能否按照相同的方式分析一下MVC框架的设计与实现原理,希望这篇文章能够满足你们的需求.在对本章内容展开介绍之前,顺便作一下广告:<ASP.NET Core 3框架揭秘>已经开始销售,现时5折优惠还有最后4天,有兴趣的从这里入群购买. 目录一.Action元数据的解析     ActionDescriptor    

[Java] 使用 Spring 2 Portlet MVC 框架构建 Portlet 应用

转自:http://www.ibm.com/developerworks/cn/java/j-lo-spring2-portal/ Spring 除了支持传统的基于 Servlet 的 Web 开发之外,也支持 JSR 168 Portlet 的开发.Spring Portlet MVC 框架尽可能多地继承了 Spring Servlet MVC 框架技术,使用了相同的底层表现层抽象和整合技术.同时,由于 JSR 168 Portlet 独特的工作流程,Spring Portlet MVC 框架

ASP.NET Core 入门教程 2、使用ASP.NET Core MVC框架构建Web应用

原文:ASP.NET Core 入门教程 2.使用ASP.NET Core MVC框架构建Web应用 一.前言 1.本文主要内容 使用dotnet cli创建基于解决方案(sln+csproj)的项目 使用Visual Studio Code开发基于解决方案(sln+csproj)的项目 Visual Studio Code Solution插件( vscode-solution-explorer)基础使用介绍 基于 .NET Core web项目模板构建 ASP.NET Core MVC We

主流MVC框架的设计模式及遵守的软件设计原则

原文地址,会不断更新  http://it.zuocheng.net/mvc-design-pattern-design-principle-summary   作程的技术博客 本文以主流的MVC框架为例,比如Java 的SSH.PHP的Symfony和Zend Framework ,在简单地剖析他们的设计原理之后,找到其中使用的设计模式:鉴赏他们的代码实现,查看设计者们都遵守了哪些软件设计原则.作此文,一为学习,二为总结.其中下面所写内容可能并不全面,也可能不准确,但会不断修改完善. 框架模式

Spring MVC 简述:从MVC框架普遍关注的问题说起

任何一个完备的MVC框架都需要解决Web开发过程中的一些共性的问题,比如请求的收集与分发.数据前后台流转与转换,当前最流行的SpringMVC和Struts2也不例外.本文首先概述MVC模式的分层思想与MVC框架普遍关注的问题,并以此为契机结合SpringMVC的入门级案例简要地从原理.架构角度介绍了它对这些问题的处理,包括请求处理流程.消息转换机制和数据绑定机制等核心问题.最后,本文对目前最为流行的两个MVC框架SpringMVC 和 一. MVC 模式与框架 1.MVC 模式 Java We

分享一实战性开源MVC框架&lt;Linux、Windows跨平台开发so easy&gt;

一.引子   开源地址 http://pan.baidu.com/s/1slCMspR .NET Core微软还在发力,但作为商用还有一段距离,很多开发库尚不能用于.NET Core,因此我们还没有看到一个大型的使用案例, 这时大家或许想到Mono部署ASP.NET MVC,但部署过的人必然知道:这不是一个容易的工作,需要各种工作,至今也没有几个人容易地完成这项工作. .NET Core作为微软的新星,但还不够成熟强大,在其发出耀眼光辉之前,我们分享一实战性强的开源MVC框架: Moon.Mvc

readbook:自己设计mvc框架,java类似struts2的实现

如果你不能简单说清楚,就是你还没有完全明白.——爱因斯坦 need things: 1.操作xml文档 dom4j 等开源类库 2. dtd的验证 等知识储备 * n到n次     ? 0到1次        + 1到n次 3. java 反射的相关知识反射过程:导入 java.lang.reflect.*1.获得需要操作的类的 Java.lang.Class对象2.调用Class的方法获取Field, Method等对象使用 反射api 进行操作 反射的常用类Class 类 : 反射的核心类,

与MVC框架解耦的OGNL:前世今生及其基本用法

摘要: 虽然我们一般都是通过学习MVC框架而结缘OGNL,但它并没有与MVC框架紧紧耦合在一起,而是一个以独立的库文件出现的一种功能强大的表达式语言,也是字符串与Java对象之间沟通的桥梁.特别地,正因为它的独立性,使得我们可以十分方便地利用它构建我们自己的框架.在充分理解和掌握 OGNL 三要素 后,我们就可以通过简单一致的语法去存取Java对象树中的任意属性.调用Java对象树的方法并自动实现必要的类型转化.本文首先概述了Ognl的前世今生,并结合具体实例和源码阐述了OGNL的实质和OGNL