MVC开发模式与ThinkPHP5.0
发布时间:2020-04-26 | 发布者: 东东工作室 | 浏览次数: 次THhinkPHP5.0是基于MVC(模型-视图-控制器)方式来组织的,MVC的全称是Model View Controller,是模型-视图-控制器的缩写,是一种软件设计典范,用一种业务逻辑,数据,界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里,在改进和个性化定制界面以及用户交互的同时,不需要重新编写业务逻辑。MVC被独特地发展起来用于映射传统的输入,处理和输出功能在一个逻辑的图形化用户界面的结构中。而MVC开发模式是一种使用MVC设计创建Web应用程序的模式。
传统的Web开发中,我们将数据的处理和数据显示写在一起,模型和视图是直接关联的,视图直接从模型获取数据并显示,代码复杂,维护困难,不利于团队分工,开发效率低
传统开发模式类似如下代码:
而使用MVC开发时,情况则发生了变化,模型和视图依旧负责数据处理和数据显示,但它们之间并不直接进行数据交换,而是借助控制器完成,控制器首先从模型中获取数据,然后根据数据的类型或者格式等选择合适的视图进行显示,从而达到模型与视图的完全分离,而是由控制器完成数据获取与展示
Model是应用程序中用以处理应用程序数据逻辑的部分,通常模型对象负责在数据库中存取数据,View是应用程序中处理数据显示的部分,通常视图是一句模型数据创建的。Controller是应用程序中处理用户交互的部分。通常控制器负责从视图中读取数据控制用户输入并向模型发送数据。
ThinkPHP的应用目录:
我们可以注意到在public目录下有一个index.php,该文件是应用的入口文件,几乎所有的PHP MVC框架都会采用单一入口(网站的所有访问都会经过该文件)进行项目访问,ThinkPHP也不例外。入口文件主要完成以下事情:
1. 定义框架路径,项目路径
2. 定义调试模式和应用模式(可选)
3. 定义全局常量(可选)
4. 加载框架入口文件
Index.php代码如下:
当我们加载一个初始的thinkphp5框架时,显示出的是一个“欢迎使用ThinkPHP!”
大致的加载流程如下:
1. Web服务器加载默认首页
2. Index.php加载ThinkPHP.php,框架开始运行
3. 当未指定模块,控制器和动作时,框架采用默认配置:Home模块,Index控制器,index动作
4. 根据APP_PATH找到Application目录,再根据模块名,控制器名和动作名找到Home目录下的IndexController.class.php,并执行其中的index方法。
ThinkPHP中的控制器:
作为MVC模式中最核心的控制器,起着沟通视图和模型的作用一个好的MVC架构中,View永远不应该直接操作Model,而应该通过View->Controller->Model的方式进行操作。一方面减少了耦合程度,另一方面之后对View进行重构时不会影响到Model。
一般来说ThinkPHP的控制器就是一个类,该类位于模块/Controller文件夹下,而操作指的是控制器的一个public方法,以下截图是最近笔者在做的一个项目的实例:(v1是版本号便于版本控制)
由上图我们可以发现控制器的定义非常简单,只需满足两个条件:(1)文件是一个php类并存放在模块/Controller文件夹下(2)继承ThinkPHP的Controller及其子类。
ThinkPHP中的视图:
视图功能由thinkView类配合视图驱动(模板引擎)类一起完成,目前的内置模板引擎包括PHP原生模板和Think模板引擎
因为新版的控制器可以无需继承任何的基础类,因此在控制器中如何使用视图取决于你怎么定义控制器。
1. 继承thinkcontroller类
如果你的控制器继承了thinkController类的话,则无需自己实例化图类,可以直接调用控制器基础类封装的相关视图类的方法。如:
fetch渲染模板输出
display渲染内容输出
assign模板变量赋值
engine初始化模板引擎
2. 助手函数:
如果只是需要渲染模板输出可以使用系统提供的助手函数view
return view('hello',['name'=>'thinkphp'])
助手函数调用格式:
view('[模板文件]'[,'模板变量(数组)'][,模板替换(数组)])
ThinkPHP中的模型:
模型类:ThinkModel配合数据库中间层ThinkDb实现了完整的ORM功能,包括CURD和ActiveRecord实现。
基础模型类Model的设计非常灵活,无需进行任何模型定义,就可以进行相关数据表的ORM和CURD操作,只需要在封装单独的业务逻辑的时候,模型类才必须是被定义的。
新版采用了PHP的Trait特性实现了模型的动态组装,可以更加灵活的实现模型的扩展
当我们需要使用模型时,首先我们需要在database.php配置文件中进行相关的设置:
而模型的定义方面,如果我们仅仅需要实现对数据表的CURD操作的话,实际上根本不需要定义模型类,直接实例化基础模型类即可。 只有当你需要额外定义模型的属性或者方法逻辑的时候,才需要额外定义模型类。模型类一般位于模块的 model 目录下面,类名通常与数据表的名相同
例如:
当我们需要使用模型时,我们需要在对应的控制器中引入该模型类,使用相关的查询语句,核心ThinkModel除了基本的CURD和AR查询之外, 还提供了一些统计函数、getField方法,及动态查询方法,使用如下:
$User = D('User');
$User->count();
$User->getField('name');
$User->getByName('thinkphp');
$User->getFieldByName('thinkphp','name');
转载请标注:东东工作室——MVC开发模式与ThinkPHP5.0