文章目录
- 一、架构总览
- 1.1、有关常用的一些概念
- 入口文件
- 应用
- 模块
- 控制器
- 操作
- 模型
- 视图
- 驱动
- 行为
- 命名空间【全限定类名】
- 1.补充
- 二、生命周期
- 三、入口文件
- 四、URL访问
- 五、模块设计
- 六、命明空间
- 七、自动加载
- 八、Traits引入
- 九、API友好
一、架构总览
ThinkPHP5.0应用基于MVC(模型-视图-控制器)的方式来组织。
- Controller(控制器)、Model(模型)、 View(视图)
5.0的URL访问受路由决定,如果
关闭路由
或者没有匹配路由
的情况下,则是基于:
http://serverName/index.php(或者其它应用入口文件)/模块/控制器/操作/参数/值…
// 是否开启路由
'url_route_on' => true
1.1、有关常用的一些概念
入口文件
程序的入口,只有通过本模块,才可以访问到,对应要访问的主程序;
在php中通过有index.php(前台应用程序入口)、还有后台程序入口(自动安装后会修改为随机名)、还有可以自定义。
应用
应用在ThinkPHP
中是一个管理系统架构及生命周期的对象,由系统中的thinkphp/library/think/App.php
完成,通常在入口文件中调用和执行。
// [ 应用入口文件 ]
// 定义应用目录
//__DIR__:当前文件所在的文件夹。
define('APP_PATH', __DIR__ . '/../application/');
// 判断是否安装
if (!is_file(APP_PATH . 'admin/command/Install/install.lock')) {
header("location:./install.php");
exit;
}
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';
通过入口文件(index.php)然后入口文件加载框架的启动类(start.php
)
start.php
// ThinkPHP 引导文件
// 1. 加载基础文件
require __DIR__ . '/base.php';
// 2. 执行应用
App::run()->send();
- 启动类
start.php
通过加载 框架的base.php
(基础类)、
【通过此类base.php
,通过获取系统文件位置信息,调用注册自动加载机制(Load.php
),若本地环境变量(.env)存在,若其中有内容,取出其配置信息,将key和value分别取出通过putenv设置服务器的环境变量。】
完成自动加载【Loader::register()
】
注册错误信息和异常处理【\think\Error::register();
】
加载惯例配置文件【\think\Config::set(include THINK_PATH . 'convention' . EXT);
】- 惯例配置文件:核心框架内置的配置文件。
- 启动主启动类,将信息发送到客户端页面;
应用具有自己独立的配置文件、公共(函数)文件。
模块
一个典型的应用是由多个模块组成的,这些模块通常都是应用目录下面的一个子目录,每个模块都有自己独立的配置文件、公共文件和类库文件。
// 是否支持多模块
'app_multi_module' => true
控制器
- 每个模块拥有独立的MVC类库及配置文件,一个模块下面有多个
控制器负责响应请求
,而每个控制器其实就是一个独立的控制器类。 - 控制器主要负责请求的接收,并调用相关的模型处理,并最终通过视图输出。
- 严格来说,控制器不应该过多的介入业务逻辑处理。
事实上,5.0中控制器是可以被跳过的,通过路由我们可以直接把请求调度到某个模型或者其他的类进行处理。
5.0的控制器类比较灵活,可以无需继承任何基础类库:
namespace app\index\controller;
class Index
{
public function index()
{
return 'hello,thinkphp!';
}
}
操作
一个控制器包含多个操作(方法),操作方法是一个URL访问的最小单元。
public function hello($name)
{
return 'Hello,'.$name;
}
操作方法可以不使用任何参数,如果定义了一个非可选参数,则该参数必须通过用户请求传入,如果是URL请求,则通常是$_GET或者$_POST方式传入。
模型
和数据库交互,处理业务逻辑。
模型类并不一定要访问数据库,而且在5.0的架构设计中,只有进行实际的数据库查询操作的时候,才会进行数据库的连接,是真正的
惰性连接
。
ThinkPHP的模型层支持多层设计,你可以对模型层进行更细化的设计和分工,例如把模型层分为逻辑层/服务层/事件层等等。
视图
控制器调用模型类后返回的数据通过视图组装成不同格式的输出。视图根据不同的需求,来决定调用模板引擎进行内容解析后输出还是直接输出。
视图通常会有一系列的模板文件对应不同的控制器和操作方法,并且支持动态设置模板目录。
驱动
系统很多的组件都采用驱动式设计,从而可以更灵活的扩展,驱动类的位置默认是放入核心类库目录下面,也可以重新定义驱动类库的命名空间而改变驱动的文件位置。
行为
行为(Behavior)是在预先定义好的一个应用位置执行的一些操作。类似于AOP【AOP面向切面编程+IOC控制反转】编程中的“切面”的概念,给某一个切面绑定相关行为就成了一种类AOP编程的思想。所以,行为通常是和某个位置相关,行为的执行时间依赖于绑定到了哪个位置上。
要执行行为,首先要在应用程序中进行行为侦听,例如:
// 在app_init位置侦听行为
\think\Hook::listen('app_init');
然后对某个位置进行行为绑定:
// 绑定行为到app_init位置
\think\Hook::add('app_init','\app\index\behavior\Test');
一个位置上如果绑定了多个行为的,按照绑定的顺序依次执行,除非遇到中断。
命名空间【全限定类名】
ThinkPHP5采用了PHP的命名空间进行类库文件的设计和规划,并且符合PSR-4的自动加载规范。是为了解决路径重名出现的。
1.补充
- PSR-4
PSR 是PHP Standards Recommendation的简称,制定的代码规范,简称PSR,是代码开发的事实标准。
PSR-4使代码更加规范,能够满足面向package的自动加载,它规范了如何从文件路径自动加载类,同时规范了自动加载文件的位置
。
PSR-4 规范也描述了放置 autoload 文件。
系统学习PSR-4