MVC设计模式
MVC概念
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
MVC三大组件
模型
Model:模型
应用程序中用于处理应用程序数据逻辑的部分。
凡是跟数据操作有关的内容都属于数据逻辑:只要与SQL指令有关,那么都属于模型(数据逻辑)
在MVC中:所有的SQL指令都应该存在于模型组件中。
视图
View:视图
应用程序中处理数据显示的部分。
视图:template(模板),用来承载数据的容器,通常是HTML文件(显示[HTML],美化[CSS]和效果[JavaScript])
控制器
Controller:控制器
应用程序中处理用户交互的部分。
控制器:也叫作模块(Module),是用来与用户直接接触的脚本代码(浏览器直接提交给PHP的脚本对象),判断用户操作的逻辑性。
控制器:在需要的时候,可以调用模型来进行数据处理(数据库操作)
控制器:在需要的时候,可以调用视图来进行数据显示(加工美化)
MVC模式意义
MVC的本质是将代码进行分离:显示数据部分(View),处理业务部分(Controller)和数据操作部分(Model)
1、 符合人类分工协作的模式(思维模式)
2、 利于代码的维护:前端(HTML)与后端(PHP)的分离
代码发展史
1、 PHP与HTML嵌入到一起:混合开发阶段
优点:效率高
缺点:代码重用性低(不利于维护)
2、 PHP与HTML分离开来(两个脚本):模板技术
优点:前后端开发人员分离,利于代码的维护
缺点:效率相对于混编较低,PHP后端代码复用性比较低
3、 PHP中业务部分与数据操作部分再次分离:MVC思想
优点:代码分离完整,利用代码重复利用
缺点:服务器要操作多个文件完成一个请求(效率最低)
效率低:指的是相对于混编模式,从计算机的高效运作来说,再对比网络延迟,效率的降低对于用户而言是感受不到。
MVC工作原理
PHP脚本工作原理
浏览器—》发起请求—》服务器PHP接收请求—》PHP处理(业务逻辑判断,数据库操作,显示数据)--》返回给浏览器
MVC工作原理
在MVC设计思想中:至少有三个文件才能服务一次请求(控制器,模型,视图)
1、用户通过浏览器发起请求
2、PHP接收请求:对应的脚本必须是控制器脚本
2.1 控制器判断用户是否操作恰当
2.2 控制器调用模型获取数据
2.3 控制器调用视图显示数据(输出)
3、PHP返回请求响应结果:控制器
MVC模式的工作流程
将MVC思想设计的项目,按照完整的请求走一遍
1、 用户浏览器输入URL:PHP脚本(控制器)
2、 服务器控制器脚本接收请求
2.1 业务逻辑判断
2.2 调用对应的模型:一个模型负责一张表对应的所有SQL操作
2.2.1 模型需要公共代码
面向过程:封装公共函数
面向对象:用类来封装公共代码(连接认证):模型继承公共模型
2.2.2 模型封装每一种数据逻辑:一个逻辑一个方法
2.3 控制器拿到数据(校验)
2.4 控制器加载模板(视图)来显示数据:显示的过程就是输出
3、 返回结果给用户
项目单一入口实现
项目单一入口:一个项目只有一个入口(用户唯一可以通过浏览器进行访问的文件)
1、 一个项目只要定义一个入口文件:index.php/admin.php/home.php
所有的用户都只能允许访问index.php
2、 “入口文件”来决定去访问对应的哪个控制器
进行很多的判断(系统初始化):单独成立一个文件
入口文件:加载并运行初始化文件
3、 初始化文件中来决定访问哪个对应的控制器
3.1 字符集设定
3.2 常量设定(目录)
3.3 系统设定
3.4 自动加载设定
3.5 初始化URL(从“URL”中获取数据):控制器和控制器类中的具体方法
3.6 加载配置文件
3.7 分发控制器
4、 控制器处理MVC工作流程
4.1 业务逻辑判断
4.2 调用模型操作数据库
4.3 调用视图显示数据
5、 结果最终是一层层返回
Index.php->初始化文件->控制器->模型和视图
模型和视图->控制器->初始化文件->index.php->返回浏览器
创建目录结构
规划框架目录
网站根目录下:应该有哪些对应的文件夹和文件
1、 入口文件:index.php
2、 应用程序目录:App文件夹,存放与当前应用有关的内容(MVC对应的文件)
3、 核心目录:Core文件夹,存放一些核心文件的(初始化,公共核心文件)
4、 Web资源目录:Public文件夹,存放的就是当前应用所需要的一些资源(样式、JS和图片等)
5、 插件目录:Vendor文件夹,存放的是一些外部提供好的完整功能的脚本(Smarty,验证码,图片上传等)
6、 配置目录:Config文件夹,存放配置文件(有可能内部再分层)
7、 文件上传目录:Upload文件夹,存放用户上传的文件
规划应用程序目录
应用程序目录:MVC对应的文件的存储
通常:一个网站分为前台和后台
1、 建立两个对应的文件夹,分离前后台业务:Home/Back,Home/Admin
2、 对应的前后台之下,都会有对应的MVC,在对应的文件夹下,再次创建分层文件夹Controller/Model/View
注意:很多时候,前后台业务不一样,但是数据操作基本差不多,基于这种情况,会将Model文件夹提升,在App目录下,与对应的前后台文件夹同级
规划Web资源目录
Web资源目录:管理对应的样式,图片和js效果,在Public目录下,创建三个对应的文件夹即可。
入口文件
入口文件:index.php,本质要做的事情非常简单
1、 实现入口设定:安全限定(只有访问index.php入口文件才有可能访问其他文件夹中的资源)
原理:在入口处定义一个常量,然后在其他文件中判断常量是否存在:存在即可访问,不存在不允许访问。
2、 引入系统初始化文件
3、 让系统初始化文件执行
搭建运行环境
1、 搭建一个虚拟主机
2、 重启apache
3、 修改本机Hosts文件
应用程序初始化类文件
要求
1、 文件需要使用命名空间(所有类文件)
2、 文件需要权限判定(所有类文件)
3、 一个功能应该是一个单独的方法
1、 run方法:运行方法
2、 初始化字符集:initCharset
3、 初始化目录常量:initDirConst
4、 初始化系统设置:initSystem
控制对应的错误显示级别,以及是否显示
Ini_set(选项,值)
5、 初始化配置文件:initConfig
6、 初始化URL:initURL
7、 初始化自动加载:initAutoload
7.1 加载方式自定义:Core/Controller/Model/Vendor
7.2 利用spl_autoload_resiter来进行自动加载
7.3 所有的类都是由命名空间控制的:系统寻找类的时候会带着空间寻找(不是一个纯粹的类名):在加载的时候,一定要去除空间
8、 分发控制器
控制器组件
功能:业务逻辑处理,调用模型获取数据,调用视图显示数据
控制器调用模型
控制器调用视图显示数据
模型组件
模型:连接数据库,进行SQL操作,数据解析
创建模型:一张表(数据)对应一个模型
模型要做的事情:连接认证(?),组织SQL指令,执行SQL指令,解析SQL执行结果
视图组件
视图:本质就是显示数据(已有数据)
增加视图文件
在视图中解析数据