关于PHP MVC简单的框架构造

MVC是这三个单词的缩写:
Model 模型,专门用来处理数据
View 视图,专门用来显示页面(HTML文件)
Controller 控制器(中控器):用来分发任务(命令模型处理数据、命令视图显示数据)

模型封装的原则:
使用OOP思想描述数据表,一张表就是一个类,这个表的所有操作(增删查改),封装到类的方法中。
模型层主要是操作数据库,我们之前封装一个PDO类在这里插入图片描述
模型封装的原则:
使用OOP思想描述数据表,一张表就是一个类,这个表的所有操作(增删查改),封装到类的方法中。
模型层主要是操作数据库,我们之前封装一个PDO类
在这里插入图片描述
模型层主要是操作数据库,我们之前封装一个PDO类来实现一个对数据库的操作。
在这里插入图片描述
由于不只是添加用户需要使用PDO操作类,删除、修改、查询用户都需要
在这里插入图片描述
使用PDO操作类,所以我们将公共的代码封装到构造方法中。
上面代码还是存在问题的,将来项目还会有很多模型类,每个模型都需要使用PDO类对数据库进行操作,所以我们要把公共的代码提取到父类中,使用的类再继承。我们称这个父类为基础模型类。
在这里插入图片描述
哪个模型类需要使用公共代码,再从基础模型类中继承即可。
基础模型类
接下来我们调用模型,需要先实例化模型对象,模型对象只需要实例化一个就够了。之前采用的是三公一私的方式,实例化一个单例对象,这样在每一个模型里都要定义3个私有和1个公共的方法。这种写法比较繁琐。
接下来我们采用一个工厂模式去实例化一个单例对象
工厂模式在我们这里指的就是,传递模型类进来,我给你生产模型对象。
在这里插入图片描述
测试一下,看工厂类是否生产出单例对象。
在这里插入图片描述
在这里插入图片描述
发现不是一个单例对象,原因是代码中每次调用M方法,都会重新定义一个数组,所以第二次再调用时不知道以前已经实例化了对象,所有他还会重新创建一个新的对象,所以我们需要把这个数组定义成一个静态变量,在脚本周期内会将数组的值保存在内存中。
在这里插入图片描述
在这里插入图片描述
控制器层封装规则:
如果按照功能模块进行划分的,便于分工协作开发,一个程序员负责一个功能,功能又是一个控制器类,所有就是说一个程序员写一个控制器就可以。
既然按照功能模块进行划分的,那么每个功能的操作(新闻中心、添加新闻等)封装到控制器的方法中。
在这里插入图片描述
Tips:方法名称后面加了Action后缀,目的是为了和模型类里的方法名重复。
通常我们在控制器这个类里面发布命令,命令模型处理数据,命令视图显示数据。
在这里插入图片描述
控制器类里边也有公共代码部分,也需要放到构造方法中。
在这里插入图片描述
功能模块不只是有一个,如果有很多个控制器,我们都需要写构造方法,那这样效率变低,所以我们要写一个基础控制器类。
单一入口文件及路由配置:
使用单一入口文件,配置路由,首先是为了程序安全,其次方便搜索引擎抓取。
如果要使用单一入口,需要配置路由。
在这里插入图片描述
单一入口文件,指的是从一个PHP页面,访问到其他的控制器。
在这里插入图片描述
切记,Controller中的一些路径,是以入口文件相对应的路径。

工厂类需要引入Model,那么制造对象的时候,不可能在控制器中引入Model类,所以在哪里实例化Model,就在哪里引入model类。
在这里插入图片描述

目录重新划分:
像Smarty这样第三方类库,我们就把Smarty封装到Vendor目录中。
像Verify(验证码)、Page(分页类)等等我们自己封装的工具,我们把这些代码 封装到Tools目录中。
像PDO这些类,和数据访问相关的我们把这些代码封装Dao目录中。
像Controller,Model,Factory这种框架核心代码,封装到Core目录中。
在这里插入图片描述
我们再看应用程序目录:
由于应用程序,分前台和后台。前台是浏览者使用的,后台是管理员进行内容管理的,所以我们项目的目录结构也就划分为前台Home和后台Admin。
由于前台和后台为了提高开发效率,那么前台和后台的目录中也需要MVC。
所以到最后的目录结构是这样的:
在这里插入图片描述

自动加载机制:
咱们在每一个控制器,每一个模型内都require_once了一个类文件,不可能所有的类文件都要手动require。当实例化一个不存在的类的时候,自动加载就会执行。
在这里插入图片描述
像这样每个控制器或每个模型都需要引入一个类文件的话,会拖我们写代码的效率,所以我们要重新拿起我们的自动加载机制。
在这里插入图片描述
在我们自动加载机制中,有一个__autoload加载方法,显然他只能定义一次,所以不满足我们的开发需求,于是我们拿起第二种自动加载机制spl_autoload_register(自动加载方法名称自定义),通过他来进行注册自动加载。
自动加载触发条件:
实例化一个不存在的类 new class
使用一个静态方法 class::action
继承 class1 extends class2 class2不存在
接口 calss implementsinterface interface不存在
在这里插入图片描述
写好自动加载之后,我们把Controller,Model中的require全部删掉。
Smarty除外,因为Smarty是一个第三方库,文件特别多,所以我们不删,接下来我们会给他特殊处理。
当我们把所有的require删掉之后,会出现这么一个问题
思考:仅仅通过类名就能找到这个类吗?
在这里插入图片描述
思考:仅仅通过类名就能找到这个类吗?
找不到这个类,因为他不知道去哪里找这个类,可能Admin Home里面都有UserController类。
解决问题:
命名空间的引用:
加命名空间的时候入口文件就不用加了(入口文件主要是加载类文件)
每个命名空间包含当前类所在的路径
Eq:框架的成员Model,Controller,命名空间定义为freamwork\core;
应用目录加命名空间的时候,不加application ,因为这个目录名称是可变的,所以我们不给他定义,直接写Admin\Controller,到后边我们要自己拼接上目录名称。
应用目录下Admin模块 控制器命名空间
在这里插入图片描述
框架基础控制器命名空间
在这里插入图片描述
单一入口文件修改
在这里插入图片描述
在这里插入图片描述
Controller基础控制器中,给new \Smarty() 变成全局
像Smarty这种第三类库,他有他自己的加载方式,所以我们不能以框架命名空间的方式去引入。
在这里插入图片描述
封装入口文件
我们编程思想是面向对象思想,所以入口文件咱们也要对他进行封装。
起名 Freamwork.class.php 放到框架根目录
在这里插入图片描述
首先咱们声明一个成员方法,自动加载注册放进去,由于我们是面向对象,所以我们不能再 注册加载中去写加载方法,咱们要把它写成类成员方法,那么我们以数组的方式,把对象和方法名称传递进去。
在这里插入图片描述
接下来我们初始化MCA,MODULE、CONTROLLER、ACTION
接收传递参数,将其写进常量中。
在这里插入图片描述
实例化方法、框架运行方法
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值