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 相关文章推荐
Adodb的十个实例(清晰版)
Dec 31 PHP
PHP编程过程中需要了解的this,self,parent的区别
Dec 30 PHP
基于PHP一些十分严重的缺陷详解
Jun 03 PHP
深入php-fpm的两种进程管理模式详解
Jun 03 PHP
php switch语句多个值匹配同一代码块的实现
Mar 03 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(二)
Jun 23 PHP
php获取、检查类名、函数名、方法名的函数方法
Jun 25 PHP
PHP的Yii框架的基本使用示例
Aug 21 PHP
PHP程序员学习使用Swoole的理由
Jun 24 PHP
laravel-admin 中列表筛选方法
Oct 03 PHP
Thinkphp集成抖音SDK的实现方法
Apr 28 PHP
Swoole源码中如何查询Websocket的连接问题详解
Aug 30 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
用PHP调用数据库的存贮过程!
2006/10/09 PHP
Thinkphp关闭缓存的方法
2015/06/26 PHP
详解php中 === 的使用
2016/10/24 PHP
TP5多入口设置实例讲解
2020/12/15 PHP
Extjs中常用表单介绍与应用
2010/06/07 Javascript
Extjs实现进度条的两种便捷方式
2013/09/26 Javascript
JS实现动态给图片添加边框的方法
2015/04/01 Javascript
jquery实现简单的遮罩层
2016/01/08 Javascript
JS基于MSClass和setInterval实现ajax定时采集信息并滚动显示的方法
2016/04/18 Javascript
jQuery解决input元素的blur事件和其他非表单元素的click事件冲突问题
2016/08/15 Javascript
js判断checkbox是否选中个数的方法(超简单)
2016/08/19 Javascript
javascript cookie用法基础教程(概念,设置,读取及删除)
2016/09/20 Javascript
AngularJS实现表单验证功能
2017/01/09 Javascript
ES6中的rest参数与扩展运算符详解
2017/07/18 Javascript
js实现扫雷小程序的示例代码
2017/09/27 Javascript
将Sublime Text 3 添加到右键中的简单方法
2017/12/12 Javascript
ng-zorro-antd 入门初体验
2018/12/03 Javascript
[01:14:55]EG vs Spirit Supermajor 败者组 BO3 第三场 6.4
2018/06/05 DOTA
Django原生sql也能使用Paginator分页的示例代码
2017/11/15 Python
Python基于回溯法解决01背包问题实例
2017/12/06 Python
Python安装图文教程 Pycharm安装教程
2018/03/27 Python
python批量下载抖音视频
2019/06/17 Python
Tensorflow实现部分参数梯度更新操作
2020/01/23 Python
使用pytorch 筛选出一定范围的值
2020/06/28 Python
Ubuntu20.04环境安装tensorflow2的方法步骤
2021/01/29 Python
施华洛世奇美国官网:SWAROVSKI美国
2018/02/08 全球购物
荷兰鞋类购物网站:Donelli
2019/05/24 全球购物
三月雷锋月活动总结
2014/07/03 职场文书
工资收入证明样本(5篇)
2014/09/16 职场文书
2014年向国旗敬礼活动方案
2014/09/27 职场文书
趣味运动会开幕词
2015/01/28 职场文书
淘宝文案策划岗位职责
2015/04/14 职场文书
2019员工保密协议书(3篇)
2019/09/23 职场文书
浅谈如何提高PHP代码的质量
2021/05/28 PHP
OpenCV实现常见的四种图像几何变换
2022/04/01 Python
Win11 PC上的Outlook搜索错误怎么办?
2022/07/15 数码科技