学习如何写PHP MVC框架(1) -- 路由

说到PHP开发web,自然离不开开发框架,开发框架为我们提供了灵活的开发方式,MVC层分离,业务解耦等。。。

第一篇先来简单点的,说说MVC框架的路由功能。。。

一般的单入口框架路由都是这样的结构:

domain/index.php/classname/functionname/var1/var2

这里的index.php 就被称为入口文件。。。对于服务器而言,你这里访问的就只有index.php 后面调用的controller 和里面的方法,甚至传值都是在框架内部基于PHP层面实现的。

Talk is cheap, show you the code !!

首先,先建立好下面的文件结构

我们来动手试试,怎么才能访问到controllers里面的文件。。。

在index.php里面输入以下内容

print_r($_SERVER);

然后访问 以下地址试试。

yourdomain/index.php/class/function/var1

这里作者我是用本地环境的,我访问的地址是localhost/MVC/index.php/class/function/var1

我贴出最重要的2个变量

[REQUEST_URI] => /MVC/index.php/class/function/var1

[SCRIPT_NAME] => /MVC/index.php

其实路由最基本的原理就在这里:

通过这2个变量来提取url地址里的class 和 function,参数等,然后把class include进来,通过PHP的回调函数  call_user_func_array 调用对应的function和传递相应的参数。

接下来上代码,读代码应该比我写的易懂。哈哈~~

index.php 的内容如下

 1 <?php
 2
 3 # 定义application路径
 4 define(‘APPPATH‘, trim(__DIR__,‘/‘));
 5
 6 # 获得请求地址
 7 $root = $_SERVER[‘SCRIPT_NAME‘];
 8 $request = $_SERVER[‘REQUEST_URI‘];
 9
10 $URI = array();
11
12 # 获得index.php 后面的地址
13 $url = trim(str_replace($root, ‘‘, $request), ‘/‘);
14
15 # 如果为空,则是访问根地址
16 if (empty($url))
17 {
18     # 默认控制器和默认方法
19     $class = ‘index‘;
20     $func = ‘welcome‘;
21 }
22 else
23 {
24     $URI = explode(‘/‘, $url);
25
26     # 如果function为空 则默认访问index
27     if (count($URI) < 2)
28     {
29         $class = $URI[0];
30         $func = ‘index‘;
31     }
32     else
33     {
34         $class = $URI[0];
35         $func = $URI[1];
36     }
37 }
38
39
40 # 把class加载进来
41 include(APPPATH . ‘/‘ . ‘application/controllers/‘ . $class . ‘.php‘);
42
43 #实例化
44 $obj = new ucfirst($class);
45
46 call_user_func_array(
47     # 调用内部function
48     array($obj,$func),
49     # 传递参数
50     array_slice($URI, 2)
51 );  

在application/controllers 里面添加下面2个文件

index.php   用于作为默认控制器

 1 <?php
 2
 3 class Index
 4 {
 5
 6     function welcome()
 7     {
 8         echo ‘I am default controller‘;
 9     }
10
11 }
12
13
14 ?> 

hello.php

 1 <?php
 2 class Hello
 3 {
 4     public function index()
 5     {
 6         echo ‘hello world‘;
 7     }
 8
 9     public function name($name)
10     {
11         echo ‘hello ‘ . $name;
12     }
13 }
14
15 ?> 

测试一下看看,能不能访问了。根据上面的路由结构。我们来试试

这个访问正常,正确调用了hello这个class内部的name方法,然后把参数barbery传递过去了。。。

再试试不输入function name,看看能不能默认调用index。。

答案也是可以的。。。

最后一个,访问root地址看看

也正确的映射到了默认控制器上。。。

ok,一个简单的MVC路由功能就完成了。。。

时间: 2024-08-28 09:52:12

学习如何写PHP MVC框架(1) -- 路由的相关文章

自己动手写PHP MVC框架

来自:yuansir-web.com / [email protected] 代码下载: https://github.com/yuansir/tiny-php-framework PHP的框架众多,对于哪个框架最好,哪个框架最烂,是否应该用框架,对于这些争论在论坛里面都有人争论,这里不做评价, 个人觉得根据自己需求,选中最佳最适合自己MVC框架,并在开发中能够体现出敏捷开发的效果就OK了,作为一个PHPer要提高自己的对PHP和MVC的框架的认识,所以自己写一个MVC框架是很有必要的, 即使不

WebApi学习笔记01:webapi框架--控制器--路由

1.解决方案 1.1概述 一个解决方案里可以包含多个项目:也可以新建“解决方案文件夹”来逻辑(不是物理存在的文件夹)划分包含项目. 1.2创建方案 打开VS,文件->新建->项目: 2.Web项目 2.1概述 本例主要介绍安装WebApi框架,因为它几乎可以寄宿在任何项目中,先从空web模板项目,也不包含核心引用开始…… 2.1创建项目 在“解决方案资源管理器”中右键,添加->新建项目: 选择模板: 2.3安装webapi 在vs中,工具->NuGet程序包管理器->管理解决

聊一个自己写的MVC框架

也有个一周没有更新博客了,其实我没有偷懒,因为之前一直在看Spring源码,所以想着去写一个类Spring的框架,也没有给自己定什么高的要求,简单实现MVC.AOP.IOC等功能就行.现在这个框架基本上已经成型了,自己也测试过了,因此拿出来和大家分享一下. 我本文就不写标题了,因为自己的思路是跟着代码走的,所以可能说着说着MVC就跳到DI那一块了.首先我在开始的时候,也是跟随着大部分人的思路,先从DispatcherServlet入手.因为为DispatcherServlet是和用户交互的.和D

从零开始写C# MVC框架之--- 配置log4日志

在框架中配置日志分2步,一个是在帮助项目Zy.Utilities--Zy.Utility.Core中新建log类,封装写入日志方法,还需要在Zy.Utility.Core添加 log4net 的引用 1.log实现类 1 [assembly: log4net.Config.XmlConfigurator(Watch = true)] 2 namespace Zy.Utility.Core 3 { 4 /// <summary> 5 /// 日志处理类 6 /// </summary>

自己写一个java的mvc框架吧(三)

自己写一个mvc框架吧(三) 根据Method获取参数并转换参数类型 上一篇我们将url与Method的映射创建完毕,并成功的将映射关系创建起来了.这一篇我们将根据Method的入参参数名称.参数类型来获取参数,并转换参数类型,使其能够符合Method的定义. 事先说明 因为这里只是一个mvc框架的简单实现,仅仅只做到了基本数据类型和基本数据类型包装类的转换,没有做到spring那样的很复杂的数据绑定功能.所以我在代码上面加了比较强的校验. 现在开始写吧 我们从一次http请求中获取参数的时候,

重建程序员能力(3)-asp.net MVC框架增加Controller

    MVC在微软中提供的框架目前只是发现是asp.net用.另 8年前,我做了个MVC的Windows APP框架如果有兴趣我日后会介绍给大家,欢迎大家关注.MVC的概念网站上有很多,大家去查阅一定能看到,这里不重复讲述了.这里只是介绍怎么加. 1. 找到asp.net项目,然后好到Controller文件夹,右键展开菜单 [添加] 展开下一层菜单,然后选择[控制器]. 2.在对话框中有3个选项,这次为表述方便先用空的MVC5控制器 3.填写一下控制器的名称按添加即可. 需要注意的是Cont

AsMVC:一个简单的MVC框架的Java实现

当初看了<从零开始写一个Java Web框架>,也跟着写了一遍,但当时学艺不精,真正进脑子里的并不是很多,作者将依赖注入框架和MVC框架写在一起也给我造成了不小的困扰.最近刚好看了一遍springMVC的官方文档,对过去一段时间的使用做了一下总结,总结了一些MVC的使用需求,打算自己开坑写一个MVC框架,虽然是重复造轮子的过程,但也是学习提高的过程. 1.我们可能需要一个什么样的MVC框架 (1)用户一:我讨厌配置文件,最好能用注解的全用注解注解,能扫描直接扫描 (2)用户二:最好我导入一个j

自制MVC框架的插件与拦截器基础

上篇谈到我自己写的MVC框架,接下来讲讲插件及拦截器! 在处理一些通用的逻辑最好把它封装一个插件或者拦截器,以便日后可以直接拿过来直接使用.在我的框架中可以通过继承以下抽象类来实现插件或者拦截器. 1. AspectInterceptor抽象类 处理动态织入的AOP拦截器,Stephen.View框架中的拦截器抽象类,所有需要动态拦截器必须实现该类,该拦截器原理是通过aspectsharp实现的.该拦截器适用于控制层的拦截,且要使控制器类支持动态拦截必须给控制器加上DynamicAttribut

Java Web自定义MVC框架详解 (转)

转自:http://blog.csdn.net/jackfrued/article/details/42774459 最近给学生讲Java Web,希望他们能够在学完这部分内容后自己实现一个MVC框架.但是突然发现百度上能搜索到的靠谱的资料并不是很多,有些只是原理没有代码实现,有些有 代码实现但是对于初学者来说理解起来还是比较困难,于是决定把自己讲自定义MVC框架的内容放在这里分享给大家,不仅仅是代码,也有原理和探讨.内容会比 较长,因为我打算用递增的方式讲解如何写一个自定义MVC框架,重点是前