ThinkPHP 简易开发思路 && MVC和URL跳转
本文作者:Twe1ve(贝塔安全实验室-核心成员)
这段时间在看PHP代码审计相关知识,国内有不少CMS都是基于ThinkPHP开发的,因此了解ThinkPHP的开发思路更容易理解这类CMS的代码
一般分为前后台等模块进行开发:
index.php前台入口文件定义引入ThinkPHP_PATH、项目路径、项目名称
define('APP_PATH', "./App/"); //项目路径
define('THINK_PATH', "./Include/");//
require THINK_PATH . 'ThinkPHP.php'; //加载ThinkPHP框架
admin.php前台入口文件定义引入ThinkPHP_PATH、后台模块路径、后台名称
define('BIND_MODULE', 'Manage'); //
define('THINK_PATH', "./Include/");
require THINK_PATH . 'ThinkPHP.php'; //加载ThinkPHP框架
在APP路径下生成MANAGE目录
MVC 框架
M-modole(模型):编写model类对数据进行操作
对应目录:项目目录/应用目录/Lib/Model
V-view(视图):编写html、页面呈现
对应目录:项目目录/应用目录/Tpl
C-controller(控制器):编写类文件(如UserAction.class.php)
对应目录:项目目录/应用目录/Lib/Action
URL 4种访问模式
模式设置:URL_MODEL=0/1/2/3 (在ThinkPHP/conf/convention.php文件中)
0、普通模式
http://域名/项目名/入口文件?m=模块名&a=方法名&键1=值1&键2=值2
1、Pathinfo(路由模式)********
http://域名/项目名/入口文件/模块名/方法名/键1/值1/键2/值2
2、Rewrite(重写模式)
http://域名/项目名/模块名/方法名/键1/值1/键2/值2
3、兼容模式 ******
http://域名/项目名/入口文件?s=模块名/方法名/键1/值1/键2/值2
URL访问Controller
http://127.0.0.1/xyhcms/index.php
默认使用的模块index(为方便理解,这里我把模块理解成Controller...和其他地方讲解的有出入)
默认使用的方法是index
即相当于访问http://127.0.0.1/xyhcms/index.php/index/index
不同栏目的跳转和页面呈现
通过上面的一些例子,应该可以看到一些端倪:
不同模块(前后台)内部通过Controller控制器实现不同栏目,再通过Controller中的方法实现不同页面的呈现
可通过一个简答的小实验来验证:
修改xyhcmsAppHomeControllerIndexController.class.php
常用变量
- __PUBLIC__: 公共(一般为public)文件目录
- __Model__: 获取当前模块名
- __ROOT__:替换为当前网站地址(不包含域名)
- __APP__:替换为当前应用URL地址(不包含域名)
- __MODULE__:当前模块URL地址(不包含域名)
- __Controller__:当前控制器URL地址(不包含域名)
- __Action__:当前操作URL地址(不包含域名)
- __SELF__:当前页面URL
参考链接:
https://blog.csdn.net/weixin_33924312/article/details/89628867
http://document.thinkphp.cn/manual_3_2.html#read_data ThinkPHP3.2完全开发手册
- 洛谷P2115 [USACO14MAR]破坏Sabotage
- 修改nw.js的exe文件使其请求管理员权限
- Leetcode-Easy 728. Self Dividing Numbers
- Leetcode-Easy 412. Fizz Buzz
- 洛谷P2678 跳石头
- 洛谷P2863 [USACO06JAN]牛的舞会The Cow Prom
- 洛谷P1908 逆序对(归并排序)
- 洛谷P1137 旅行计划
- 洛谷P1722 矩阵 II
- 洛谷P1976 鸡蛋饼
- 洛谷P1420 最长连号
- 各种读入方式速度比较
- 美团NLP实习面试总结一 基本知识4 数据结构二 NLP相关技术1 LSTM2 介绍实体链接与实体映射3 解释随机游走的原理及作用4 命名实体识别
- 【下载】苹果发布Turi Create机器学习框架,5行代码开发图像识别
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- 【SpringBoot源码解析】第二章:SpringBoot是如何通过内置Tomcat启动的
- 技术译文 | How Can ScaleFlux Handle MySQL Workload?
- 技术译文 | MySQL 8 需要多大的 innodb_buffer_pool_instances 值(上)
- 前端登录,这一篇就够了
- 技术译文 | MySQL 8 需要多大的 innodb_buffer_pool_instances 值(下)
- 创建线程到底有多少种方式?
- CANet|拼接注意力网络
- SQL 中判断条件的先后顺序,会引起索引失效么?
- 一个超酷的开源uHand2.0机械手掌项目
- 神经网络低比特量化——TQT
- web前端面试题:您能读懂的Promise源码实现(手写代码)
- web前端面试题对答篇:HTTP fetch发送2次请求的原因?
- MySQL 8.0之hash join
- MySQL 8.0 之原子DDL
- 翻译|MySQL 基于ScaleFlux SSD性能测试