架构
目录结构
PpWeb 框架目录结构如下:
ppweb Web 部署目录├─_template 内置模板目录│ ├─ModelM.php 模型模板文件│ ├─View.html 视图模板文件│ └─ViewC.php 视图控制器模板文件│├─app 应用程序目录│ ├─a 第三方接口目录│ ├─c 公有类库目录│ ├─cmd 命令行工具目录│ ├─i 公有继承控制器目录│ ├─j JSON格式配置文件目录│ ├─m 公有模型目录│ └─v 视图目录│ └─cmd 命令行工具视图目录│├─conf 框架配置目录│ ├─db.json 数据库配置文件│ ├─developer.json 开发者配置文件│ └─redis.json Redis 配置文件│├─core 框架核心目录│ ├─func 函数库目录│ │ ├─common.php 常用的函数文件│ │ ├─devtest.php 开发测试的函数文件│ │ └─fileoper.php 文件操作的函数文件│ ││ ├─page 框架内置页面目录│ │ ├─404.php 404页面文件│ │ └─Repair.php 应用维护页面文件│ ││ ├─Config.php 获取配置类文件│ ├─Core.php 框架核心类文件│ ├─Mysqli_1_3.php MySQLi 操作类文件│ └─View.php 视图引擎类文件│├─data 应用数据目录│ └─base.sql MySQL 核心数据文件│├─tmp 应用缓存目录│ ├─asset 应用视图静态资源缓存目录│ ├─compile 应用编译缓存目录│ ├─log 应用日志目录│ ├─upload 应用上传缓存目录│ └─v 应用视图缓存目录│├─upload 上传文件目录├─.htaccess Apache 配置文件├─index.php 框架入口文件├─robots.txt Robots 协议文件├─web.conf Nginx 配置文件└─web.config IIS 配置文件
唯一入口
入口文件默认为 PpWeb 根目录下的 index.php
文件。是客户端唯一能够请求的 PHP 文件,负责将客户端请求分发给控制器进行业务处理(本身不具备业务处理能力)。
执行流程如下:
定义常量
文件引入
载入开发者工具
URL获取
域解析
配置
网站更新
设备解析
模块解析
传参解析
加载控制器
渲染视图
结束连接
离线任务
应用划分
PpWeb 采用多个应用共存的方式,目录结构如下:
├─app 应用程序目录│ ├─application_one 应用程序1目录│ │ ├─ModuleOne 模块1目录│ │ ├─ModuleTwo 模块2目录│ │ └─... 更多模块目录│ ││ ├─application_two 应用程序2目录│ │ ├─ModuleOne 模块1目录│ │ ├─ModuleTwo 模块2目录│ │ └─... 更多模块目录│ │
请注意
遵循 PpWeb 对于应用的命名规范,全部采用小写英文字母和下划线命名(不得包含除此之外的字符)。
模块化设计
标准的应用模块目录结构如下:
├─app 应用程序目录│ ├─application_one 应用程序1目录│ │ ├─ModuleOne 模块1目录│ │ │ ├─OneC.php 控制器1文件│ │ │ ├─TwoC.php 控制器2文件│ │ │ └─... 更多控制器文件│ │ ││ │ ├─ModuleTwo 模块2目录│ │ └─... 更多模块目录│ │
请注意
遵循 PpWeb 对于模块的命名规范,全部采用大驼峰命名法的英文字母命名(不得包含除此之外的字符)。
URL映射
URL映射是路由的一部分。作用是通过 URL 定位到具体处理的程序,分别有如下几种映射方式:
域映射
设备映射
模块映射
控制器映射
控制器行为映射
命名空间
PpWeb 符合自动加载规范,内置不再提供类库文件的导入方法,采用命名空间方式定义和自动加载类库文件,有效的解决了多模块和类库之间的命名空间冲突问题,并且实现了更加高效的类库自动加载机制。
遵循 PpWeb 自动加载规范,需要给类库定义所在的命名空间,就能实现类库的自动加载。例如 \app\myapp\Index\IndexC
类库的命名空间定义为:
namespace app\myapp\Index; class IndexC{}
请注意
命名空间的路径与类库文件的目录一致(包括大小写)
实例化该类如下:
$class = new \app\myapp\Index\IndexC();
值得注意的是如果你需要调用 PHP 内置的类库,或者第三方没有使用命名空间的类库记得在实例化类库的时候加上 \
符号,例如:
# 错误的用法$class = new stdClass(); # 正确的用法$class = new \stdClass();
依赖注入
依赖注入其实本质上是指对类的依赖通过构造器完成自动注入,用来更方便的管理类库依赖。
用下面这个代码片段举例:
namespace app\myapp\Index; use core\Mysqli; class IndexC{ public function show() { $db = new Mysqli(); $db->conn('BASE'); }}
如果以上的代码片段不使用依赖注入,则如下面这个代码片段:
namespace app\myapp\Index; class IndexC{ public function show() { $db = new \core\Mysqli(); $db->conn('BASE'); }}