thinkPHP5.0框架整体架构总览【应用,模块,MVC,驱动,行为,命名空间等】


Posted in PHP onMarch 25, 2017

本文讲述了thinkPHP5.0框架整体架构。分享给大家供大家参考,具体如下:

ThinkPHP5.0应用基于MVC(模型-视图-控制器)的方式来组织。

MVC是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型(M)、视图(V)、控制器(C),它们各自处理自己的任务。

5.0的URL访问受路由决定,如果关闭路由或者没有匹配路由的情况下,则是基于:

http://serverName/index.php(或者其它应用入口文件)/模块/控制器/操作/参数/值...

下面的一些概念有必要做下了解,可能在后面的内容中经常会被提及。

入口文件

用户请求的PHP文件,负责处理一个请求(注意,不一定是URL请求)的生命周期,最常见的入口文件就是index.php,有时候也会为了某些特殊的需求而增加新的入口文件,例如给后台模块单独设置的一个入口文件admin.php或者一个控制器程序入口think都属于入口文件。

应用

应用在ThinkPHP中是一个管理系统架构及生命周期的对象,由系统的 \think\App类完成,应用通常在入口文件中被调用和执行,具有相同的应用目录(APP_PATH)的应用我们认为是同一个应用,但一个应用可能存在多个入口文件。

应用具有自己独立的配置文件、公共(函数)文件。

模块

一个典型的应用是由多个模块组成的,这些模块通常都是应用目录下面的一个子目录,每个模块都自己独立的配置文件、公共文件和类库文件。

5.0支持单一模块架构设计,如果你的应用下面只有一个模块,那么这个模块的子目录可以省略,并且在应用配置文件中修改

'app_multi_module' =>  false,

控制器

每个模块拥有独立的MVC类库及配置文件,一个模块下面有多个控制器负责响应请求,而每个控制器其实就是一个独立的控制器类。

控制器主要负责请求的接收,并调用相关的模型处理,并最终通过视图输出。严格来说,控制器不应该过多的介入业务逻辑处理。

事实上,5.0中控制器是可以被跳过的,通过路由我们可以直接把请求调度到某个模型或者其他的类进行处理。

5.0的控制器类比较灵活,可以无需继承任何基础类库。

一个典型的Index控制器类如下:

namespace app\index\controller;
class Index 
{
  public function index()
  {
    return 'hello,thinkphp!';
  }
}

操作

一个控制器包含多个操作(方法),操作方法是一个URL访问的最小单元。

下面是一个典型的Index控制器的操作方法定义,包含了两个操作方法:

namespace app\index\controller;
class Index 
{
  public function index()
  {
    return 'index';
  }
  public function hello($name)
  {
    return 'Hello,'.$name;
  }
}

操作方法可以不使用任何参数,如果定义了一个非可选参数,则该参数必须通过用户请求传入,如果是URL请求,则通常是$_GET或者$_POST方式传入。

模型

模型类通常完成实际的业务逻辑和数据封装,并返回和格式无关的数据。

模型类并不一定要访问数据库,而且在5.0的架构设计中,只有进行实际的数据库查询操作的时候,才会进行数据库的连接,是真正的惰性连接。

ThinkPHP的模型层支持多层设计,你可以对模型层进行更细化的设计和分工,例如把模型层分为逻辑层/服务层/事件层等等。

视图

控制器调用模型类后返回的数据通过视图组装成不同格式的输出。视图根据不同的需求,来决定调用模板引擎进行内容解析后输出还是直接输出。

视图通常会有一系列的模板文件对应不同的控制器和操作方法,并且支持动态设置模板目录。

驱动

系统很多的组件都采用驱动式设计,从而可以更灵活的扩展,驱动类的位置默认是放入核心类库目录下面,也可以重新定义驱动类库的命名空间而改变驱动的文件位置。

行为

行为(Behavior)是在预先定义好的一个应用位置执行的一些操作。类似于AOP编程中的“切面”的概念,给某一个切面绑定相关行为就成了一种类AOP编程的思想。所以,行为通常是和某个位置相关,行为的执行时间依赖于绑定到了哪个位置上。

要执行行为,首先要在应用程序中进行行为侦听,例如:

// 在app_init位置侦听行为
\think\Hook::listen('app_init');

然后对某个位置进行行为绑定:

// 绑定行为到app_init位置
\think\Hook::add('app_init','\app\index\behavior\Test');

一个位置上如果绑定了多个行为的,按照绑定的顺序依次执行,除非遇到中断。

命名空间

ThinkPHP5采用了PHP的命名空间进行类库文件的设计和规划,并且符合PSR-4的自动加载规范。

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
php时间不正确的解决方法
Apr 09 PHP
PHP filter_var() 函数 Filter 函数
Apr 25 PHP
PHP计数器的实现代码
Jun 08 PHP
php读取mysql的简单实例
Jan 15 PHP
php截取字符串函数substr,iconv_substr,mb_substr示例以及优劣分析
Jun 10 PHP
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
Jul 01 PHP
浅析PHP中strlen和mb_strlen的区别
Aug 31 PHP
PHP中使用php5-ffmpeg撷取视频图片实例
Jan 07 PHP
javascript数组与php数组的地址传递及值传递用法实例
Jan 22 PHP
phalcon model在插入或更新时会自动验证非空字段的解决办法
Dec 29 PHP
PHPExcel导出2003和2007的excel文档功能示例
Jan 04 PHP
php+javascript实现的动态显示服务器运行程序进度条功能示例
Aug 07 PHP
thinkPHP5.0框架开发规范简介
Mar 25 #PHP
thinkPHP5.0框架安装教程
Mar 25 #PHP
thinkPHP5.0框架应用请求生命周期分析
Mar 25 #PHP
LAMP环境使用Composer安装Laravel的方法
Mar 25 #PHP
CI(CodeIgniter)框架视图中加载视图的方法
Mar 24 #PHP
总结的一些PHP开发中的tips(必看篇)
Mar 24 #PHP
CI(CodeIgniter)框架实现图片上传的方法
Mar 24 #PHP
You might like
15个小时----从修改程序到自己些程序
2006/10/09 PHP
smarty模板局部缓存方法使用示例
2014/06/17 PHP
php常用数学函数汇总
2014/11/21 PHP
ThinkPHP实现递归无级分类――代码少
2015/07/29 PHP
php头像上传预览实例代码
2017/05/02 PHP
Windows平台实现PHP连接SQL Server2008的方法
2017/07/26 PHP
Yii使用DbTarget实现日志功能的示例代码
2020/07/21 PHP
单击按钮显示隐藏子菜单经典案例
2013/01/04 Javascript
javascript日期对象格式化为字符串的实现方法
2014/01/14 Javascript
jQuery获得包含margin的outerWidth和outerHeight的方法
2015/03/25 Javascript
跟我学习javascript的作用域与作用域链
2015/11/19 Javascript
javascript入门之数组[新手必看]
2016/11/21 Javascript
JavaScript之RegExp_动力节点Java学院整理
2017/06/29 Javascript
vue+springmvc导出excel数据的实现代码
2018/06/27 Javascript
浅谈JS和jQuery的区别
2019/03/27 jQuery
layui点击左侧导航栏,实现不刷新整个页面,只刷新局部的方法
2019/09/25 Javascript
[01:10]DOTA2次级职业联赛 - U5战队宣传片
2014/12/01 DOTA
[44:15]DOTA2上海特级锦标赛主赛事日 - 5 败者组决赛Liquid VS EG第二局
2016/03/06 DOTA
按日期打印Python的Tornado框架中的日志的方法
2015/05/02 Python
详解Python爬虫的基本写法
2016/01/08 Python
Python中整数的缓存机制讲解
2019/02/16 Python
python实现图书借阅系统
2019/02/20 Python
解析Python3中的Import
2019/10/13 Python
Python进程间通信multiprocess代码实例
2020/03/18 Python
python+adb+monkey实现Rom稳定性测试详解
2020/04/23 Python
HTML5 Canvas玩转酷炫大波浪进度图效果实例(附demo)
2016/12/14 HTML / CSS
phonegap常用事件总结(必看篇)
2017/03/31 HTML / CSS
linux系统都有哪些运行级别
2012/04/15 面试题
优秀德育工作者事迹材料
2014/05/07 职场文书
民主生活会对照检查材料(统计局)
2014/09/21 职场文书
2015年宣传部工作总结范文
2015/03/31 职场文书
长江七号观后感
2015/06/11 职场文书
高中运动会前导词
2015/07/20 职场文书
我爱我班主题班会
2015/08/13 职场文书
Python控制台输出俄罗斯方块的方法实例
2021/04/17 Python
python和C/C++混合编程之使用ctypes调用 C/C++的dll
2022/04/29 Python