特点:
1.ThinPHP是免费开源的,快速简单的,面向对象的,轻量级PHP开发框架
2. 2006年初创立,遵循Apache2开源协议发布
3. 秉承简洁实用的设计原则,注重易用性
4.拥有众多的原创功能和特性,在易用性,扩展性和性能封面不断优化和改进
5.成为国内最领先和最具影响力的WEB应用开发框架
一 开发环境安装
PHP>=5.4.0
PDO MbString CURL PHP Extension
Mysql 5.5以上
Apache Nginx
安装三种方式
二 MVC介绍
初探TP5—URL路由—请求响应–模板视图
MVC优势:耦合性低,重用性高,可维护性高,有利于软件的工程化
MVC的变形
1.五Model模式的web开发
2 五View模式的Api接口开发
3.Model再分层和Controller再分层
三 Tp5目录和规范
1.目录结构
-application 应用目录(几乎整个项目的内容都写在这里)
|-index(这里的文件夹tp5叫做模块-----一般是前台模块,也可以根据需要需求修改成其他(例如:home),需要修改配置文件,修改默认模块、控制器、操作) 【注】:TP5默认只有一个index文件(模块)和一个控制层(conrroller),我们在写代码的时候会自己新建一个model和view,这样就组成了这个Index模块儿的MVC(controller控制层,model模型层,view视图层),如需后台(一般来说都需要),则需要新建一个后台模块(admin)
|-controller(控制层)
|-model(模型层)
|-view(视图层)
|-admin(后台模块)
|-controller(控制层)
|-model(模型层)
|-view(视图层)
|- command.php 是控制台的配置文件,当我们用命令行执行thinkphp的时候,它会读取command.php的配置
|- common.php 它是项目的公共文件,当我们编写一些通用函数的时候,比如我们写一个函数,想在所有的模块儿中都能调用,那么我们就可以把函数写在改文件中,它就可以注册到全局,在任何地方都可以调用
|- config.php 它是应用的配置文件,整个用用都读取这个配置,也就是admin模块儿和index模块儿会通用这个配置
|- database.php 它是数据库配置文件,如果我们需要连接数据库,那么我们只需要修改database.php的配置就可以了
|- route.php 它是路由文件,当我们想对URL进行美化,那么我们就可以修改此文件,对其增加一些路由配置,就可以达到美化的效果
|- tags.php 它是应用行为扩展文件,在thinkphp中,它为我们埋下了很多钩子,我们可以对框架进行扩展,而不需要修改框架本身的源码,我们需要在某一个钩子上注册某些函数,或者是注册某些行为,来通过行为来改变框架的执行流程
|-extend 目录,这个目录是我们下载第三方库时候使用的,当然我们不是通过composer来下载的,比如说我们有一个第三方库,我们用着比较好用,但是它没有composer包,我们就可以将类库下载到extend目录,之后我们修改一下命名空间,就可以直接在我们的应用中使用
|-publiic 我们网站的根目录,也就是说我们网站根目录下所有的这些文件都是允许访问的
|-static 主要用来放静态文件,比如说css,js,图片等等
|-index.php 整个网站或整个应用的入口文件,所有的请求都会经过index.php之后再去转发
|-router.php 它是框架快速启动的测试文件,比如你本地没有安装Apache,只安装了PHP,那么我们可以同过,PHP内置的workserver来启动,通过这个文件,我们就可以启动这个框架
|-runtime 它是网站运行中的缓存文件,它包括日志,缓存和编译文件等等。
|-thinkphp 它是框架文件,也就是说thinkphp5的框架都在里边
|-lang 里边是语言包
|-library 目录是框架的核心,它里边有think(它是整个框架的核心文件)和traits(它是类库的扩展)两个目录
|-think Think 类库包目录
|-traits 系统 Traits 目录
|-tpl 是我们框架默认的一些模板(了解知识)
|-default_index.tpl 它是我们自动生成的控制器模板文件
|-dispatch_jump.tpl它是我们网站发出成功或失败的中间跳转文件
|-page_trace.tpl它是我们调试时显示的模板文件
|-think_exception.tpl它是我们抛出异常时页面展示的文件
|-base.php 定义一些常量
|-console.php 它是控制台的入口文件
|-convention.php 是框架惯例配置文件
|-help.php 助手函数
|-start.php是框架启动文件
|-vendor 是composer安装过程中生成的目录,通过composer安装的所有类库都被安装在了这个目录中
2.TP5开发规范:
* 目录命名、配置参数、非类库文件名、表名、字段名:小写+下划线
类文件名和其内的类名:驼峰,首字母大写,两者名字要一样
函数、属性名:驼峰,首字母小写
常量:大写字母+下划线
类文件名均以.php结尾
类文件的命名空间和类文件所在的路径一致
以双下划线__开头的函数或方法为魔术方法
应用的类库文件的命名空间,最顶级的统一为app
五 ThinPHP5模块设计
common继承
ThinkPHP5配置
thinkphp提供两种获取和设置配置的方式,一种是通过think下的config类进行改变,另一种是通过config初始函数来进行设置和改变;config初始函数其实就是think下config类或者是封装。
位于 Thinkphp下的convertion文件里面 config()
定义整个框架系统的配置文件目录
1.在public目录下,打开index.php,在代码中define(‘CONF_PATH’,DIR.’/…/conf/’)
2.tp5提供了一个获取框架配置参数(惯例配置)的助手函数 config(),这个函数返回的配置参数来源于thinkphp目录下的convention.php文件
1.php应用配置
2 查惯例配置
在APP模块文件(如index(模块文件名)/Index(类名)/index.php)中写
dump(config());在浏览就可以看惯例配置,惯例文件是在thinkphp框架文件夹中的convention.php
应用配置
在APP(应用目录)同一级下建conf文件夹并在此文件夹中建config.php文件:写相应的配置(如:return[‘app_debug’=>‘ture’,‘app_name’=>‘nihao’])
并在根目录下的入口文件(app/public/index.php)加入如下代码:
defile(‘CONF-PATH’,DIR . ‘/…/conf/’)
3扩展配置
4.场景配置
(1)场景配置:不同办公环境中,使用不同配置
(2)config下新建不同办公环境配置文件,eg:设置在家办公环境home.php;公司办公环境 office.php;
(3)在config.php设置数组‘app_status’=>‘home’/‘office’
(4)如果需要在不同环境中配置不同的数据库设置,需要把整个数据库的设置拷贝到数组下
5. 模块配置
1.之前的扩展配置和场景配置都是相对应用级别的,而模块配置是相对模块级别,作用域不同
2.实现的方式
a.在conf目录下建立与app目录下模块名相同的目录,该目录下在创建config.php文件,那么这个文件中的配置参数只在访问 对应的app模块的时候生效
6 动态配置
7 Config类和助手函数config
Congfig::set(“名”,“值”,“模块”)
Congfig::get(“名”,“值”,“模块”)
对应模块的才能获取到
Config::has(“名”),不存在和null都返回false
8 环境变量配置和使用
入口文件
单入口文件的定义: 应用程序所有的http请求都由一个文件接收并由该文件转发到功能代码中
单入口文件:安全检测,请求过滤,
tp5定义的常量一般都存放在thinkphp框架目录下base.php中
9 隐藏文件
隐藏入口文件
1.什么是隐藏入口文件:其实就是将入口文件index.php不显示在路由中,例如:在不开启隐藏入口文件设置下,需要访问应用默认的index方法,需要这样写:localhost/index.php/index/index/index,如果开启隐藏入口文件设置,那么将index.php拿掉也是可以访问
2.如何来设置隐藏入口文件:apache提供重写静态规则在public目录下创建.htaccess文件,默认apache会去访问这个文件,实现隐藏的需求;nginx需要在nginx.conf文件中配置静态规则
10 入口文件绑定
define(‘BIND_MODULE’,‘admin’);
在public下可创建多一个入口文件,可实现不同入口文件访问不同模块。
tp框架提供了一个入口文件自动绑定功能 “auto_bind_module”=> true,入口文件名与模块文件名相同时,自动访问与之对应的模块。等同于在 admin,php中定义 define(“BIND_MODULE”,“admin”);
绑定模块一般适用于小型企业网站,一个控制器够用的情况,大型项目不建议使用。
绑定模块方法1:
tp\public\index.php入口文件指定默认模块
define(‘BIND_MODULE’,‘admin’);//绑定admin模块,可以访问控制器->方法
11 路由
在config.php中配置
// 是否开启路由
“url_route_on” => true,
同级目录下创建 route.php文件,把需要更换的目录地址替换,而原先的地址已经不可以访问
// 是否强制使用路由
“url_route_must” => false
当开启强制路由,一定要用路由
六 请求
获取Request对象的3种方法:
1.助手函数request(). $req = request();
2.用think下的request类. (单例模式)
use think\Request;
$req = Request::instance()
3.也要引用think下的Request.
public function index(Request KaTeX parse error: Expected '}', got 'EOF' at end of input: req){ dump(req);
}
1 视图
通过控制器 渲染视图 传参
Index控制器下的index()方法渲染view/index/index.html
return view(‘index’,[‘参数名’=>‘参数值’],[‘被替换的值’=>‘欲替换的值’]);
如:
return view(‘index’,[‘a’=>‘10’],[‘Hi’=>‘HelloWorld’]);
在index.html 中
{$a} 输出 10
Hi 输出 HelloWorld
2、视图路径
view(‘page_1’)或view(‘page_1.html’) 对应 view/控制器名/page_1.html
view(‘hello/page_2’) 对应 view/hello/page_2.html
view(’./page_3.html’) 对应 public/page_3.html
3、使用controller类(该类不是必须的,但如果需要调用该类的方法,则必须继承)
use think\controller;
class 类名 extends controller
$this 表示已继承的controller的类对象
$this->assign(变量名,值);
$this->display(值,[keyValue数组]);
4 变量的输出,赋值和替换
thinkPHP向页面赋值有四种方式:(需要先继承Controller)
$this->assign(‘key’, ‘value’);
$this->view-> key = ‘value’;
$this->fetch(‘html模板名’, [
‘key’ => ‘value’,
‘key2’ => ‘value2’
]);
View::share(‘key’, ‘value’); # 使用该方法必须先 use think\View;
5-3 系统变量原生标签
1.在模板中使用系统变量,格式形如: {KaTeX parse error: Expected 'EOF', got '}' at position 14: Think.xxx.xxx}̲。 eg: {Think.server.HTTP_HOST}
{KaTeX parse error: Expected 'EOF', got '}' at position 25: ….PHP_APP_STATUS}̲ {Think.session.name}
{KaTeX parse error: Expected 'EOF', got '}' at position 17: …hink.cookie.uid}̲ {Think.get.sid}
{KaTeX parse error: Expected 'EOF', got '}' at position 18: …ink.request.sid}̲ {Think.post.id}
{KaTeX parse error: Expected 'EOF', got '}' at position 21: ….const.APP_PATH}̲ // 获取系统常量 {Think.APP_PATH} // 获取系统常量,可省略const,直接加常量名
模板变量
模板循环便签
volist:一般循环select结果(二维数组)
{$a.email}
{/volist}{
vo.email}{/foreach}比较标签
相等:eq标签(也可以写equal),用法是 {equal name=“a” value=“6”}相等{else/}不相等{/equal},name是控制器分配的变量名,value是要对比的值(也可以使用模板分配的变量),else是取反,一定要加斜杠
不相等:neq标签(也可以写成notequal),用法同上
大于:gt标签,用法同上
小于:lt标签,用法同上
大于等于:egt标签,用法同上
小于等于:elt标签,用法同上
{switch name=“Think.get.level”}
{case value=“1”}普通会员{/case}
{case value=“2”}2普通会员{/case}
{case value=“3”}3普通会员{/case}
,用extend继承 name=‘目录’,后面没有后缀名,{block name=’’}{/block}方法来修改
2{block}能 输出原来模板内容
3,layout ‘layout_on’ =>‘true’ ‘layout_name’=>'a’开启后默认的访问view文件机制发生变化,会访问view/a.html,a.html 中的{CONTENT}的内容会被index控制器下指定方法对应view/index/*.html文件内容替换,通过给方法传递参数() a.html可以显示不同的内容