MVC模式讲解(1)
控制器的典型实现
控制器的作用
- 获取请求数据
- 根据请求信息,以决定,调用哪个模型以获取什么数据;
- 根据请求信息,载入哪个视图文件以显示该(些)数据
数组函数in_array()的用法:

控制器类的常规做法
先观察目前写完的2个控制器:

自然,还可以按此模式,写更多的控制器。
但基本模式都一样:
其功能:
1,用于获取用户的请求数据,
2,(或)获取模型数据,
3,显示到视图中——或也可能直接输出;
控制器的划分
通常,一个项目中,会有很多很多的功能,我们通常会将一些“相关功能”,合在一起,称为“一个模块”,并使用一个控制器去“表达”这个模块中的各个功能——其实就是方法。
图示如下:

控制器中的“动作”:
一个控制器,就是一个类;
一个控制器中,就只包含了一些方法!!!
那么, 这些方法,被称为“动作”——因为每个方法,一定就对应了网页界面上用户所在的某个“操作”(动作,请求);
习惯上,所有的动作(方法),都以“Action”这个词为结尾。
这些动作(方法名),将会对应网页上的连接(或跳转或提交)动作中的“act”参数的值!
类似这样:

对应(userController中):

又来:

对应(userController中):

实际应用中,在网页的连接(或跳转或提交)的时候,act=XXX会写成:
a=XXX
如下:

则在控制器中获取数据时:

基础控制器类
一个项目中,有多个控制器!
每个控制器是一个类文件!
每个控制器中都有各自的一些功能——方法——动作!
但:
他们常常,有一些共同的工作或事情要去做:
1,设定编码!
因为是由控制器来决定显示什么数据,也就应该由其来决定使用什么编码!
一般来说,每一个网站(项目/软件)产品,通常都是使用一种相对固定的编码。
则他们应该可以进行“统一设置”;
2,页面的简短消息(提示文字)的显示,以及跳转功能。
这也是常见的通用功能。

使用:


视图层的典型做法
- 功能:展示页面的静态内容,以及相关的变量数据。
- 数据分为:
- 普通标量数据:echo $v1;
- 数组数据:foreach($arr as $key => $value){....}
- 或单独输出:echo $arr[‘id’]; echo $arr[‘age’]; .....
- 对象数据: echo $obj->p1; echo $obj->p2;
有关MVC的其他常见做法
请求分发器(前端控制器):
先观察现有的控制器:

则:
有没有可能,使用一个参数,在每次请求的时候,都带上“要使用的”控制器名?
如果可以,则,我们就可以将代码进一步“提升”(简化为):
$c = “User”; //它也可能是“product”,或其他。。。
require ‘./” . $c . “Model.class.php’;
require './ModelFactory.class.php'; //这个都一样,不同动
require './BaseController.class.php';//这个都一样,不同动
class XXXController extends BaseController{ ...... } //代表某个控制器,每个控制器是一个独立文件
require ‘./’ . $c . “Controller.class.php”; //这里才是需要载入的“当前控制器类”
$controller_name = $c . “Controller”; 构建控制器的类名
$ctrl = new $controller_name (); //可变类
$act = !empty($_GET['a']) ? $_GET['a'] : "Index";
$action = $act . "Action";
$ctrl->$action();
完整代码如下所示:

这就是,所谓的前端控制器(请求分发器):
它的作用是:
1,根据传过来的c请求数据,决定使用哪个控制器;——有默认值,目前为User
2,根据传过来的a请求数据,决定使用哪个动作(方法);——有默认值,目前为Index
而且,此时,UserController类和ProductController类中,没有其他代码了,只有“纯类”的定义代码


而且,在所有的“连接”(跳转,表单提交)中,都相应的改为:


浙公网安备 33010602011771号