ThinkPHP学习

第一部分

框架概述

框架就是一些代码类、方法(函数)、变量、常量的集合,这些代码是功能结构性的代码(并非业务代码)。业务代码其实就是具体的一些模块的增删改查逻辑代码。使用框架开发项目,有便于代码重用、开发效率高、代码规范好、便于功能扩展等优点。

一般框架都是基于MVC架构。


PHPStudy构建虚拟主机

ThinkPHP的主目录在public下。
成功配置会显示:


TP框架基础

TP框架的基本结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
 1.project  应用部署目录
2.├─application 应用目录(可设置)
3.│ ├─common 公共模块目录(可更改)
4.│ ├─index 模块目录(可更改)
5.│ │ ├─config.php 模块配置文件
6.│ │ ├─common.php 模块函数文件
7.│ │ ├─controller 控制器目录
8.│ │ ├─model 模型目录
9.│ │ ├─view 视图目录
10.│ │ └─ ... 更多类库目录
11.│ ├─command.php 命令行工具配置文件
12.│ ├─common.php 应用公共(函数)文件
13.│ ├─config.php 应用(公共)配置文件
14.│ ├─database.php 数据库配置文件
15.│ ├─tags.php 应用行为扩展定义文件
16.│ └─route.php 路由配置文件
17.├─extend 扩展类库目录(可定义)
18.├─public WEB 部署目录(对外访问目录)
19.│ ├─static 静态资源存放目录(css,js,image)
20.│ ├─index.php 应用入口文件
21.│ ├─router.php 快速测试文件
22.│ └─.htaccess 用于 apache 的重写
23.├─runtime 应用的运行时目录(可写,可设置)
24.├─vendor 第三方类库目录(Composer)
25.├─thinkphp 框架系统目录
26.│ ├─lang 语言包目录
27.│ ├─library 框架核心类库目录
28.│ │ ├─think Think 类库包目录
29.│ │ └─traits 系统 Traits 目录
30.│ ├─tpl 系统模板目录
31.│ ├─.htaccess 用于 apache 的重写
32.│ ├─.travis.yml CI 定义文件
33.│ ├─base.php 基础定义文件
34.│ ├─composer.json composer 定义文件
35.│ ├─console.php 控制台入口文件
36.│ ├─convention.php 惯例配置文件
37.│ ├─helper.php 助手函数文件(可选)
38.│ ├─LICENSE.txt 授权说明文件
39.│ ├─phpunit.xml 单元测试配置文件
40.│ ├─README.md README 文件
41.│ └─start.php 框架引导文件
42.├─build.php 自动生成定义文件(参考)
43.├─composer.json composer 定义文件
44.├─LICENSE.txt 授权说明文件
45.├─README.md README 文件
46.├─think 命令行入口文件
配置文件

1.三个层级的配置文件:

1
2
3
框架主配置文件(惯例配置文件) thinkphp/convention.php
应用公共配置文件 application/config.php, application/database.php
对整个应用生效模块配置文件 application/模块目录/config.php 对当前模块生效

2.其他说明:
配置文件格式 return array( 键值对 );
加载顺序: 框架主配置文件 》 应用公共配置文件 》 模块配置文件
配置文件生效顺序: 后加载的生效(后加载的配置项会覆盖之前配置项)
如果要手动进行配置,一般不要修改框架本身的主配置文件,而是在应用或者模块配置文件中进行配置。

函数文件
1
2
3
框架助手函数文件:thinkphp/helper.php
应用公共函数文件:application/common.php
模块函数文件:application/模块目录/common.php

框架的生命周期

通俗的讲就是:一个url请求从开始到结束的流程


TP中的Controller

后缀名

一般TP框架,默认的controller是无特殊后缀的,例如:index的控制器就是Index.php,类名是Index。
如果想要加特殊后缀,需要在配置文件中进行修改:

1
'controller_suffix' => 'Controller'

那么我们在创建TP框架的时候必须加上Controller,例如:现在的index的控制器就是IndexController,类名为:IndexController

定义控制器

定义位置:application/模块目录/controller/目录下
命名规则:控制器名称(首字母大写) + (控制器后缀,默认没有) + .php

编写控制器:
1.声明命令空间:namespace app\模块目录名\controller
2.引入控制器基类(可选) use think\Controller; think是命名空间 Controller是基类控制器
3.定义当前控制器类,继承控制器基类(可选)
例如:定义一个test控制器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

<?php
/*
File Name : Test
Description : https://da4er.top
date : 2020-03-26
Author : Da4er's
*/
namespace app\index\controller;
use think\Controller;
class Test extends Controller{
public function index(){
echo "hello world";
exit();
}
public function da4er(){
echo "https://da4er.top";
}
}
框架的控制器
1
2
3
命名空间本身是PHP就有的,用来防止命名冲突问题的。
TP框架中的命名空间,通常和目录挂钩。
原因:TP中的自动加载机制,会将类的命名空间作为加载路径的一部分。

TP框架的使用:

1
2
3
①声明命名空间 使用namespace关键字
②引入指定的类 使用use关键字 命名空间\类名称
③完全限定式访问 在使用类时,\完整命名空间\类名称(继承和实例化)

url访问

还有一种隐藏入口文件的写法:

1
http://域名/模块名/控制器名称/操作方法名称/参数名/参数值

隐藏入口文件我们需要对apache进行重写,具体操作如下:

1
2
3
1.httpd.conf配置文件中加载了mod_rewrite.so模块
2.AllowOverride None 将None改为 All
3.把下面的内容保存为.htaccess文件放到应用入口文件的同级目录下

1
2
3
4
5
6
7
8
1.<IfModule mod_rewrite.c>
2.Options +FollowSymlinks -Multiviews
3.RewriteEngine on
4.
5.RewriteCond %{REQUEST_FILENAME} !-d
6.RewriteCond %{REQUEST_FILENAME} !-f
7.RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]
8.</IfModule>

使用Apapche的重写机制隐藏入口文件后,如果在整个url后面加上.html后缀, 让整个url看起来像是访问的静态页面。这叫做“伪静态”。


调试模式

我们可以在application/config.php下开启调试模式

开启前后对比:


创建模块

一般TP的模块需要三个目录(MVC) 两个php文件(common,config)

设置默认访问模块

命令行创建模块

一般在TP的根目录下,有一个think文件,我们可以通过命令行执行这个文件,创建模块或控制器等。

创建模块
1
php think build --module 模块名

执行成功后会自动生成那个五个文件,不需要手动创建。

创建控制器
1
2
php think make:controller 模块名/控制器名 
php think make:controller 模块名/控制器名 --plain

创建控制器时,同样会创建一些常用的方法。

加上 –plain 参数 表示创建没有方法的空控制器类。否则控制器类中会自带一些方法。
比如:创建home模块Index控制器,执行命令 php think make:controller home/Index即可。
注意:控制器名首字母大写。

创建模型
1
php think make:model 模块名/模型名

注意:模型名首字母大写


Request请求类

1.获取输入变量

总体来说获取输入变量有四个方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1.通过创建request类
$request = \think\Request::instance();
$name = $request->param('name');
echo $name;

2.通过tp提供的request()助手函数
$request1 = request();
$id = $request1->param("id");
echo $id;

3.通过继承Controller类
$request3 = $this->request;
$password = $request3->param("pw");
echo $password;

4.通过input()函数
$in = input("param.qq");
echo $in;
1
http://www.tpshop.com/index/test/da4er/name/da4er/id/1/pw/3333/qq/666

参数绑定

方法参数绑定是把URL地址(或者路由地址)中的变量作为操作方法的参数直接传入。
这样就可以直接在方法里使用。
例如如下代码:

在我们方法这个方式时,传递的id参数值会直接输出。

我们可以随意添加参数:

依赖注入

听起来很高大上,其实通俗的讲就是:我们声明的一个类的实例,在另一个类的方法的参数中传递。

在TP框架中也有使用的依赖注入:

所以我们可以直接调用request类的方法。
如下图使用:

对Request类的总结:

1
2
3
4
5
6
7
8
9
10
11
12
//1.获取请求对象  
$request = request();
$request = \think\Request::instance();
$request = $this->request; //仅限于继承了底层控制器的情况下
public function save(Request $request) //依赖注入
//2. 接收请求参数 param方法
$params = $request->param();
$params = input();
$params = request()->param();
$id = $request->param('id');
$id = input('id');
public function edit($id)//参数绑定

视图

视图的组成

TP框架下有一个封装好的View类,可以类似Smarty一样对html赋值

模板的定义

为了对模板文件更加有效的管理,ThinkPHP对模板文件进行目录划分,默认的模板文件定义规则是:视图目录/控制器名(小写)/操作名(小写)+模板后缀
比如:admin模块index控制器的index方法调用的模板定义在了view/index/index.html

模板渲染

在控制器方法中渲染有两种方法:

1
2
第一种:使用assign方法进行模板赋值,使用fetch方法进行模板渲染。
第二种:使用助手函数view(), 进行模板渲染并赋值。

整合模板和框架

模板整合思路:

①确定页面的访问路径(模块、控制器、方法)
②新建对应的控制器方法,在方法中调用模板
③将模板页面移动到对应的视图目录下(创建子目录)
④将静态资源文件移动到public/static/admin目录下
⑤修改模板文件中静态资源路径

模板布局

这个比较特殊。使用模板布局,就是把多个模板页面都有的公共代码给抽取出来,放到一个公共位置开发维护。
好处:相同的代码只维护一份,减少代码工作量。
全局布局设置步骤:
1.application/模块名/config.php,加入以下设置

1
2
3
4
'template'  =>  [
'layout_on' => true,//开启布局
'layout_name' => 'layout',//布局文件名称
]

我们在view下创建一个layout.html就会自动调用这个html文件

调用顺序:当启用layout时,不管是否定义了别的模板,layout.html先被调用,其会覆盖掉别的定义模板。
在layout.html中使用自定义的模板,可以使用CONTENT关键字。
用法

1
{__CONTENT__}

临时关闭layout可以使用:

1
$this->view->engine->layout(false);

注:也可以使用STATIC 代替静态资源路径中的/static


第二部分

模型

在application/database.php中配置数据库信息

特殊表名处理
查询多个数据

有很多方法,这里写我喜欢用的一种

1
2
3
$goods = new GoodsModel();
$data = $goods ->select();
$data = (new \think\Collection())->toArrary();

动态调用select方法来获取数据,最后通过collection类整合成标准的二维数组
后台商品展示实例:

查询一条数据
1
2
3
4
5
6
$good = new GoodsModel();
$data = $good->find($id);

where('字段名','表达式','查询条件')
$good = new GoodsModel();
$data = $good->where('id','=',$id);
连贯查询

原理:中间调用的方法,返回值是对象,可以继续调用对象的其他方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$model = new Address();

$model->field('id,name')->select(); //指定要查询的字段,原生sql中select后面的字段

$model->order('id desc,time desc')->select(); //相当于原生sql中的order by

$model->limit(3)->select(); //相当于原生sql中的limit条件

$model->limit(0,3)->select();

$model->limit('0,3')->select();

$model->group('cate_id')->select(); //相当于原生sql中的group by

$model->having('id>3')->select(); //相当于原生sql中的having条件

$model->alias('a')->join('think_user_type t','a.id=t.user_id', 'left')->select(); //alias方法设置别名,join方法连表查询

//Address::alias('a')->join('tpshop_user u','a.user_id = u.id', 'left')->select();

字段数据查询

有两种方法,一种使用find()查询后,用索引的方式调用。另一种就是调用value方法

1
2
3
4
5
6
7
$good = new GoodModel();
$data = $good->find($id)->value('goods_name');

-------------

$data = $good->find($id);
$content = $data['goods_name'];

系统变量
查询数据(一条)

save()

查询数据(多条)

saveAll()

过滤非数据表字段
表单验证

使用tp给的一个类:new \think\Validate()

TP框架的基本操作已经学完,以后就是看TP手册自己调试。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×