请求分发器(前端控制器):
先观察现有的控制器:
问题:
有没有可能使用一个参数,在每次页面发生请求的时候,都带上“要使用的”控制器?
如果可以,我们就可以将代码进一步进行简化和提升。
提升代码如下:
此时,UserController类和ProductConroller类中,没有其他代码了,只有“纯类”的定义代码。
在所有连接、跳转、表单提交中,都有了新的参数提交:
这就是请求分发器(前端控制器)
它的作用是:
1.根据传过来的c请求数据,决定使用哪个控制器——上图示例中有默认值,为User
2.根据传过来的a请求数据,决定使用哪个动作(方法)——上图示例中有默认值,为Index.
目录结构的设定
通常,我们会将一个MVC项目中的一些相应的文件,分门别类的存放,结果类似于:
MVC项目/
index.php
/Controllers/
XX1Controller.class.php
XX2Controller.class.php
…
/Models/
XX3Model.class.php
XX4Model.class.php
…
/Views/
page1.html
page2.html
…
/Framework/
BaseController.class.php
BaseModel.class.php
ModelFactory.class.php
MySQLDB.class.php
基础常量的设定
我们在MVC中,会用到很多“相对固定的目录路径”,使用一个常量来表示它,常常能够简化代码。
例如,在index.php页面中:
相应的,其他一些需要载入文件的位置(主要是“控制器”中载入视图),也可以简化,比如:
自动加载的实现
说明:
1.自动加载是指:在需要一个类的时候,自动去加载该类的对应类文件。
2.自动加载,不能自动加载“视图文件”;
禁止其他目录中的文件被直接访问
找到站点的配置项中的“目录权限设置项”
(站点配置-apache-conf-extra-httpd-vhosts.conf)
修改如下:
重启apache
然后,在mvc框架的application目录和framework目录下,都放置一个相同的文件(.htaccess)。
其内容为(只有一行):
Deny from All
示例: