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 相关文章推荐
WINDOWS下php5.2.4+mysql6.0+apache2.2.4+ZendOptimizer-3.3.0配置
Mar 28 PHP
php 广告调用类代码(支持Flash调用)
Aug 11 PHP
php中0,null,empty,空,false,字符串关系的详细介绍
Jun 20 PHP
php中stream(流)的用法
Mar 25 PHP
ThinkPHP快速入门实例教程之数据分页
Jul 01 PHP
PHP轻量级数据库操作类Medoo增加、删除、修改、查询例子
Jul 04 PHP
PHP实现一维数组转二维数组的方法
Feb 25 PHP
分享php分页的功能模块
Jun 16 PHP
php实现网页缓存的工具类分享
Jul 14 PHP
PHP实现带重试功能的curl连接示例
Jul 28 PHP
php微信支付之公众号支付功能
May 30 PHP
PHP实现rar解压读取扩展包小结
Jun 03 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
3款值得推荐的微信开发开源框架
2014/10/28 PHP
PHP实现的二分查找算法实例分析
2017/12/19 PHP
laravel 实现向公共模板中传值 (view composer)
2019/10/22 PHP
Extjs实现进度条的两种便捷方式
2013/09/26 Javascript
CSS图片响应式 垂直水平居中
2015/08/14 Javascript
CascadeView级联组件实现思路详解(分离思想和单链表)
2016/04/12 Javascript
浅析JavaScript 箭头函数 generator Date JSON
2016/05/23 Javascript
JavaScript 数组中最大最小值
2016/06/05 Javascript
JS实现的表头列头固定页面功能示例
2017/01/10 Javascript
jquery获取下拉框中的循环值
2017/02/08 Javascript
简单实现jQuery手风琴效果
2017/08/18 jQuery
利用js编写网页进度条效果
2017/10/08 Javascript
vue.js开发实现全局调用的MessageBox组件实例代码
2017/11/22 Javascript
react+ant design实现Table的增、删、改的示例代码
2018/12/27 Javascript
JS实现二维数组元素的排列组合运算简单示例
2019/01/28 Javascript
微信公众号生成新浪短网址的实现(快速生成)
2019/08/18 Javascript
[43:57]LGD vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
[54:15]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第二场2月1日
2021/03/11 DOTA
Python爬虫框架Scrapy实例代码
2018/03/04 Python
浅谈python str.format与制表符\t关于中文对齐的细节问题
2019/01/14 Python
pandas DataFrame行或列的删除方法的实现示例
2019/08/02 Python
python给图像加上mask,并提取mask区域实例
2020/01/19 Python
Python格式化输出--%s,%d,%f的代码解析
2020/04/29 Python
Python while true实现爬虫定时任务
2020/06/08 Python
H5 meta小结(前端必看篇)
2016/08/24 HTML / CSS
英国复古皮包品牌:Beara Beara
2018/07/18 全球购物
美国最大的购物网站:Amazon.com(亚马逊美国)
2020/05/23 全球购物
链表面试题-一个链表的结点结构
2015/05/04 面试题
六查六看自查材料
2014/02/17 职场文书
怎样拟定创业计划书
2014/05/01 职场文书
公证书格式
2015/01/23 职场文书
杭白菊导游词
2015/02/10 职场文书
行政助理岗位职责范本
2015/04/11 职场文书
党员承诺书范文2015
2015/04/27 职场文书
Python 如何将integer转化为罗马数(3999以内)
2021/06/05 Python
一篇文章带你掌握SQLite3基本用法
2022/06/14 数据库