thinkphp框架

发布时间 2024-01-07 15:26:41作者: xirang熙攘

一、框架概述

1、什么是框架

框架就是一些代码类、方法(函数)、变量、常量的集合,这些代码是功能结构性的代码(并非业务代码)。业务代码其实就是具体的一些模块的增删改查逻辑代码。

使用框架开发项目,有便于代码重用、开发效率高、代码规范好、便于功能扩展等优点。

mvc:

M:模型model,处理业务数据,与数据库做交互。

V:视图view,显示html页面,用户能够看到并与之交互的页面。

C:控制器controller,接收请求,调用模型处理数据,调用视图显示页面。

整个网站应用,分为模型、视图、控制器三大部分组成。

二、ThinkPHP框架安装

1、下载并解压框架

下载地址:http://www.thinkphp.cn

img

下载后解压到工作目录

img

2、配置虚拟主机

①通过phpStudy的“站点域名管理”进行配置或者直接修改apache的虚拟主机配置文件,

img

将站点域名指向项目目录下的public目录

img

②域名解析,修改hosts文件

img

增加域名如下: 多个域名可以写在同一行,以空格隔开

127.0.0.1 tpshop.com www.tpshop.com

③重启apache,在浏览器访问配置的虚拟站点http://www.tpshop.com

img

看到以上界面,说明框架安装成功。

apache配置参考(不要照搬):

<VirtualHost *:80>
    DocumentRoot "E:\phpStudy\WWW\tpshop\public"
    ServerName www.tpshop.com
    ServerAlias tpshop.com
  	<Directory "E:\phpStudy\WWW\tpshop\public">
      	Options FollowSymLinks ExecCGI
        AllowOverride All
        Order allow,deny
        Allow from all
        Require all granted
  	</Directory>
</VirtualHost>

三、TP框架基础

1、目录结构(重点)

(见手册--基础--目录结构)

 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                 命令行入口文件

2、配置文件(重点)

(见手册--配置)

①三个层级的配置文件:

框架主配置文件(惯例配置文件) thinkphp/convention.php

应用公共配置文件 application/config.php, application/database.php 对整个应用生效

模块配置文件 application/模块目录/config.php 对当前模块生效

②其他说明:

配置文件格式 return array( 键值对 );

加载顺序: 框架主配置文件 》 应用公共配置文件 》 模块配置文件

配置文件生效顺序: 后加载的生效(后加载的配置项会覆盖之前配置项)

如果要手动进行配置,一般不要修改框架本身的主配置文件,

而是在应用或者模块配置文件中进行配置。

3、函数文件

框架助手函数文件 thinkphp/helper.php

应用公共函数文件 application/common.php

模块函数文件 application/模块目录/common.php

一般不建议直接修改thinkphp/helper.php

4、开发规范(了解)

TP框架编码规范:见手册--基础--开发规范

img

扩展:PSR代码规范:https://www.kancloud.cn/thinkphp/php-fig-psr/3139

img

5、请求的生命周期

框架的生命周期,也就是请求的执行流程:

img

四、TP框架中的控制器

1、控制器的后缀

打开配置文件application/config.php,有如下配置

'controller_suffix' => false,

表示默认情况下,控制器无特殊后缀。例如 Index控制器,文件名为Index.php

如果需要进行设置,可以设置为(我们不需要这么设置)

'controller_suffix' => 'Controller',

表示控制器以Controller为后缀。例如Index控制器,文件名为IndexController.php

2、控制器的定义

(见手册--控制器--控制器定义)

1)定义位置及命名规则

定义位置:application/模块目录/controller/目录下

命名规则:控制器名称(首字母大写) + (控制器后缀,默认没有) + .php

默认:Index控制器 Index.php

User控制器 User.php

Test控制器 Test.php

示例:

img

2)编写控制器

①声明命名空间 namespace app\模块目录名\controller

②引入控制器基类(可选) use think\Controller; think是命名空间 Controller是基类控制器

③定义当前控制器类,继承控制器基类(可选)

示例:定义测试控制器Test.php

img

3、框架中的命名空间

命名空间本身是PHP就有的,用来防止命名冲突问题的。

TP框架中的命名空间,通常和目录挂钩。

原因:TP中的自动加载机制,会将类的命名空间作为加载路径的一部分。

img

TP中命名空间使用:

①声明命名空间 使用namespace关键字

②引入指定的类 使用use关键字 命名空间\类名称

③完全限定式访问 在使用类时,\完整命名空间\类名称(继承和实例化)

如果一个类没有命名空间,使用 \类名

4、url访问

(见手册--架构--URL访问)

ThinkPHP5.0框架中,默认使用PATH_INFO方式的url进行访问。

示例:http://www.tpshop.com/index.php/Index/Test/index/page/10

格式:http://域名/入口文件/模块名/控制器名称/操作方法名称/参数名/参数值

隐藏入口文件写法:http://域名/模块名/控制器名称/操作方法名称/参数名/参数值

需要对apache进行设置(手册--架构--URL访问、手册--部署--URL重写)

img

使用PHPStudy需要将 public目录的.htaccess文件中,index.php后面加上?

1562229371393

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

5、调试模式

(见手册--错误与调试--调试模式)

默认情况下,如果代码有误(比如控制器名拼写有误),会出现以下错误:

img

错误描述比较模糊,不方便进行错误调试。这种模式通常叫做“部署模式”(生产模式)。

开发阶段可以将框架设置为调试模式,便于进行错误调试:

修改 项目目录\application目录\config.php

img

开启调试模式后,报错信息格式如下:

img

会提示详细错误信息 和 错误位置(参考位置)。

相对于 线上环境(开发完成后的阶段),叫做 部署模式或者生产模式。

五、创建模块

1、创建前台和后台模块

一个典型的应用是由多个模块组成的(通常有前台网站模块和后台管理系统模块),这些模块通常都是应用目录下面的一个子目录,每个模块都有自己独立的配置文件、公共文件和类库文件。

我们给项目创建home(前台)和admin(后台)两个模块:

img

img

2、设置默认访问模块

打开配置文件application/config.php,有如下配置

'default_module' => 'index',

表示默认访问模块为index模块

可以更改默认模块为home模块

'default_module' => 'home',

六、命令行创建模块目录及文件

项目根目录 执行命令(think文件所在的目录)

1、命令行创建模块目录

(见手册 -- 命令行 -- 自动生成目录结构)

通常可以通过以下命令,自动生成模块目录

php think build --module 模块名

比如:创建test模块目录,执行命令 php think build --module test即可。(模块名小写)

img

2、命令行创建控制器

(见手册 -- 命令行 -- 创建类库文件)

通常可以通过以下命令,自动创建控制器

php think make:controller 模块名/控制器名 
php think make:controller 模块名/控制器名 --plain

加上 --plain 参数 表示创建没有方法的空控制器类。否则控制器类中会自带一些方法。

比如:创建home模块Index控制器,执行命令 php think make:controller home/Index即可。

注意:控制器名首字母大写。

img

3、命令行创建模型

(见手册 -- 命令行 -- 创建类库文件)

通常可以通过以下命令,自动创建模型

php think make:model 模块名/模型名

比如:创建home模块User模型,执行命令 php think make:model home/User即可。

注意:模型名首字母大写。

img

七、Request请求类

1、获取输入变量

(见手册--请求--输入变量)

要获取当前的请求信息,可以使用\think\Request类

$request = \think\Request::instance();

或者使用助手函数

$request = request();

img

也可以单独获取get变量或者post变量

Request::instance()->get();
Request::instance()->post();
input('get.');
input('post.');

img

代码示例:

img

浏览器访问效果:

img

特殊说明:路由变量与get变量

http://www.tpshop.com/home/test/index/id/100?page=10

param方法 能够获取所有参数(id, page)

get方法 只能获取?后面的请求字符串的参数(page)

route方法 只能获取到?前面的路由中的参数(id)

2、参数绑定

(见手册--请求--参数绑定)

方法参数绑定是把URL地址(或者路由地址)中的变量作为操作方法的参数直接传入。

img

img

使用示例:home模块Test控制器read方法中,声明$id参数

img

访问url中,传递id参数 http://www.tpshop.com/home/test/read/id/100

效果:

img

3、依赖注入

(见手册--请求--依赖注入)

依赖注入:简单的说,要在一个类A中使用另一个依赖类B时,不直接在类A中实例化类B,而是先实例化类B后再以参数的形式传入类A.

imgimg

框架中的使用:

1562229297100

1562229323006

原理分析:

1562229272862

补充说明:Request请求类中,封装了很多和请求相关的方法,详情见手册--请求(多看)

小结:

可以找到任何一种方法 接收请求参数

//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)//参数绑定

八、ThinkPHP框架中的视图

1、视图的组成

View视图类(继承了自定义模板引擎,功能与Smarty类似)

HTML模板文件

2、模板的定义

(见手册--模板--模板定位)

为了对模板文件更加有效的管理,ThinkPHP对模板文件进行目录划分,默认的模板文件定义规则是:视图目录/控制器名(小写)/操作名(小写)+模板后缀

默认的视图目录是模块的view目录,框架的默认视图文件后缀是.html。

比如home模块 Index控制器index方法要调用的模板定义为view/index/index.html

1562229244022

3、模板渲染

(见手册--视图--模板渲染,手册--视图--模板赋值)

在控制器方法中,

第一种:使用assign方法进行模板赋值,使用fetch方法进行模板渲染。

第二种:使用助手函数view(), 进行模板渲染并赋值。

使用示例:

1562228904272

注:模板中输出变量值: {$模板变量名}

九、将后台模板与框架做结合

模板整合思路:

①确定页面的访问路径(模块、控制器、方法)

②新建对应的控制器方法,在方法中调用模板

③将模板页面移动到对应的视图目录下(创建子目录)

④将静态资源文件移动到public/static/admin目录下

⑤修改模板文件中静态资源路径

页面分布:

登录页 Login控制器login方法 login.html

首页 Index控制器index方法 index.html

商品列表 Goods控制器index方法 goods_list.html -> index.html

商品新增 Goods控制器create方法 goods_add.html -> create.html

商品修改 Goods控制器edit方法 goods_edit.html -> edit.html

管理员列表 Manager控制器index方法 manager_list.html -> index.html

管理员新增 Manager控制器create方法 manager_add.html -> create.html

管理员修改 Manager控制器edit方法 manager_edit.html ->edit.html

...

1、模板布局

(见手册--模板--模板布局)

使用模板布局,就是把多个模板页面都有的公共代码给抽取出来,放到一个公共位置开发维护

好处:相同的代码只维护一份,减少代码工作量

后台全局布局设置步骤:

①修改配置文件application/admin/config.php,加入以下设置

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

1562228971516

②将静态资源文件移动到/public/static/admin目录下

1562229048578

③在application/admin/view目录下,新建layout.html

将后台页面公共的头部、底部代码提取到layout.html中,在中间位置放一个特殊字符串“{_CONTENT_}”,表示此位置,替换为原始要访问的页面内容。

layout.html文件中, 只保留所有页面公共 的css和js相关代码,修改静态资源路径

注: 一定不能 直接将所有css和js都放在layout.html中。

注:TP框架中,模板中的静态资源路径,不能使用相对路径./ ,必须使用以/开头的路径。

1562229014904

④临时关闭模板布局

全局布局设置,对所有页面全部生效。

特殊页面(不需要使用布局的页面),可以在控制器方法中,临时关闭模板布局。

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

比如登录页面,不需要使用布局,见 “3、后台登录页”

2、后台首页

①确定页面的访问路径(模块、控制器、方法)

admin模块Index控制器index方法

②新建对应的控制器方法,在方法中调用模板

<?php
namespace app\admin\controller;

use think\Controller;

class Index extends Controller
{
	public function index()
	{
		return view();
	}
}

③将模板页面移动到对应的视图目录下

index.html => application/admin/view/index/index.html

④修改模板文件

保留页面独有的静态资源文件,以及主体部分代码

修改模板文件中静态资源路径

1562229073574

注:如果页面显示效果不对,可以考虑先删除缓存 runtime目录

3、后台登录页

①确定页面的访问路径(模块、控制器、方法)

admin模块 login控制器 login方法

②新建对应的控制器方法,在方法中调用模板

注:后台的登录页面,不需要使用布局

1562229165085

③将模板页面移动到对应的视图目录下

将login.html 移动到 application/admin/view/login/目录下

1562229188964

⑤修改模板文件中静态资源路径

修改application/admin/view/login/login.html

注:也可以使用_STATIC_ 代替静态资源路径中的/static(手册--视图--输出替换)

1562229209387

总结:

1.安装部署框架,熟悉目录结构(application public)

2.控制器定义、控制器的访问(隐藏入口文件、Path_info格式url) 能够访问到指定的控制器方法

3.命令行操作(创建模块,创建控制器类)(环境变量等)

4.Request请求对象基本使用--接收参数(熟练使用一种写法)

5.模板整合(模板布局)

十、ThinkPHP框架中的模型

模型的作用:处理业务数据,与数据库进行交互。

1、导入数据表

新建tpshop数据库(create database tpshop character set utf8 collate utf8_general_ci)

image-20190705215748963

导入数据表(source sql路径)

image-20190705220021876

刷新之后,数据表如下:

image-20190705220137413

说明:如果导入sql文件时,有报错,提示类似“不能使用innodb”

解决办法:

打开mysql配置文件,修改如下

image-20190705220353745

重启mysql即可。

如果重启失败,找到mysql的安装目录下data目录,删除以ib开头的文件(可以先备份),再重启。

image-20190705220506751

2、配置数据库连接信息

(见手册--数据库--连接数据库)

TP框架中,数据库的连接信息是通过配置文件来设置的。

修改application/database.php

image-20190705220936053

image-20190705221145052

注:框架底层使用PDO来连接数据库,从配置文件中读取相关连接信息。

时间戳:上述配置中,

'auto_timestamp'  => true    	// 自动写入时间戳字段

设置为true 表示数据表新增数据、修改数据的时候会自动维护对应的时间信息

字段名默认创建时间字段为create_time,更新时间字段为update_time,支持的字段类型包括timestamp/datetime/int

(见手册--模型--时间戳)

image-20190705221338224

3、模型的定义

(见手册--模型--定义)

定义位置:application/当前分组目录/model目录下

命名规则:模型会自动对应数据表,模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写,例如:

模型名 约定对应数据表(假设数据库的前缀定义是 think_)
User think_user
UserType think_user_type

可以使用命令行创建模型:

php think make:model 模块名/模型名

示例:创建后台商品模型 Goods.php

php think make:model admin/Goods

image-20190705221507611

4、特殊表名称的处理

特殊表:没有前缀的表,或者前缀与配置项的设置不一致。

解决办法:模型中使用$table属性来设置完整数据表名称。

比如:

image-20190705221608674

十一、查询多条数据(重点)

(见手册--模型--查询) 增删改查 (CURD create update read delete)

注意:控制器中使用模型类,必须先引入模型类。

image-20190705221719531

1、获取多个数据(推荐静态调用select方法)

①静态调用all方法或者select方法

// 获取所有数据 all 和 select

$list = User::all();

// 根据主键获取多个数据all 和 select   where id in (1,2,3)

$list = User::all('1,2,3');

$list = User::all([1,2,3]);

//或者使用数组查询(只能用all不能用select)   where status = 1

$list = User::all(['status'=>1]);

②动态调用all方法或者select方法

$user = new User();

//查询所有数据all 和 select

$list = $user->select();

//根据主键查询多条数据all 和 select

$list = $user->select('1,2,3');

$list = $user->select([1,2,3]);

//或者使用数组查询(只能用all不能用select)

$list = $user->all(['status'=>1]);

注:all方法或者select方法返回的是一个包含模型对象的二维数组或者空数组

select方法和All方法的应用:[obj, obj]

image-20190705223124633

效果:

image-20190705223201855

整个返回结果数据结构 [obj,obj,obj,...]

image-20190705223357427

为了打印查看方便,可以将返回的结果 转化为标准的二维数组

1562380869575

2、案例:后台商品列表展示

1)思路:

模板整合(略)

①控制器方法中,调用模型查询数据(模板变量赋值)

②数据在模板展示

2)所用知识点:

本章节之获取多个数据、变量输出与数组遍历、URL生成

3) 实现:

①修改Goods控制器index方法,查询列表页所需数据

image-20190705224434315

②修改view/goods/index.html,遍历数组展示数据

image-20190705224516590

image-20190705224547695

3、(模板中)变量输出与数组遍历

1)变量赋值与变量输出

①模板赋值:

在控制器中,使用$this -> assign(“视图模板中的变量名”, 变量值);

使用传入参数方法:view(‘模板名’, [‘视图模板中的变量名’ => 变量值]);

②变量输出:

在模板文件中,直接输出变量 {$变量名}

输出数组中的值: 点语法 {$变量名.键名} ; 数组语法 {$变量名[‘键名’]}

输出对象中的属性: 冒号语法 {$变量名:属性名} ; 对象语法 {$变量名->属性名]}

③默认值设置语法: {$变量名|default=”默认值”}

2)循环输出标签volist

(见手册--模板--内置标签)

TP框架内置的遍历数组的标签: volist标签 和foreach标签。

{volist name='数组变量名' key='k' id='v' offset='5' length='10' empty='nothing'}{/volist}

name:要遍历的数组名,不需要$符号

key:定义循环变量名,默认为i, 当前遍历的是第几个,从1开始计数,与原数组下标无关。

id:当前的循环变量,是一个变量名

offset:指定从第几个开始遍历,从0开始计数

length:指定遍历多少个元素就结束。

empty:没有数据时显示的内容

其中:如果没有定义key属性, 可以直接输出{$key}变量表示原数组的下标。

注意:这几个属性的值必须有单、双引号

image-20190705224720544

3)循环输出标签foreach

Foreach标签和volist标签类似,用法更加简单

最简单的用法:

{foreach $list as $k=>$v} {/foreach}

也可以使用完整写法:

{foreach name='数组变量名' key='k' item='v'}{/foreach}

name:要遍历的数组名,不需要$符号

key:定义循环变量名,原数组的下标

item:当前的循环变量,是一个变量名

其中,使用完整写法时,如果没有定义key属性, 可直接输出{$key}变量表示原数组的下标。

完整写法:

image-20190705224759581

简洁写法:

image-20190705224843816

4、URL生成

(见手册--路由--URL生成)

image-20190705225019125

image-20190705225057295

url函数的第一个参数“模块/控制器/方法”, 可以简写为“方法”,表示当前模块当前控制器的指定方法。

使用示例:商品列表页 商品新增跳转地址 可以省略模块和控制器名称,默认取当前页面所在的模块和控制器

image-20190705225128359

十二、查询一条数据(重点)

1、获取一个数据(推荐静态调用find方法)

①静态调用get方法或者find方法

//取出主键为1的数据  where id = 1

$user = \app\admin\model\User::get(1);

$user = \app\admin\model\User::find(1);

//使用数组查询(非主键字段),只能用get不能用find   where name = 'thinkphp'

$user = User::get(['name' => 'thinkphp']);

//取出第一条数据,只能用find不能用get

$user = User::find();

②动态调用get方法或者find方法

$user = new User();

//取出主键为1的数据

$info = $user->find(1);

$info = $user->get(1);

//使用数组查询(非主键字段),只能用get不能用find

$info = $user->get(['name' => 'thinkphp']);

//取出第一条数据,只能用find不能用get

$info = $user->find();

注:get或者find方法返回的是当前模型的对象实例或者null

返回的模型对象,可以直接当做数组使用,也可以调用toArray() 直接转化为数组。

find方法和Get方法的应用:

image-20190705222623107

效果:

image-20190705222755651

2、案例:后台商品详情展示

①修改Goods控制器read方法,查询详情页所需数据

1562342419140

②修改view/goods/index.html,遍历数组展示数据

1562342475557

十三、其他查询方法(重点:where方法)

1、where方法(查询语法)

见手册--数据库--查询构造器--查询语法

where('字段名','表达式','查询条件');

whereOr('字段名','表达式','查询条件');
表达式 含义
EQ、= 等于(=)
NEQ、<> 不等于(<>)
GT、> 大于(>)
EGT、>= 大于等于(>=)
LT、< 小于(<)
ELT、<= 小于等于(<=)
LIKE 模糊查询
[NOT] BETWEEN (不在)区间查询
[NOT] IN (不在)IN 查询
[NOT] NULL 查询字段是否(不)是NULL
[NOT] EXISTS EXISTS查询
EXP 表达式查询,支持SQL语法
> time 时间比较
< time 时间比较
between time 时间比较
notbetween time 时间比较

注:where方法中,如果比较表达式是等于,可以省略这个参数。

应用示例:

$info = User::where('id','=','1')->find();

$info = User::where('id','1')->find();

$info = User::where('name','like','%thinkphp%')->select();

image-20190705223507911

注意:使用了where方法后,查询数据可以使用find方法和select方法,不能使用get方法和all方法。(原因:where方法返回的是Query对象,不是模型对象)

扩展:批量条件查询(手册-数据库-查询构造器-高级查询)

image-20190705223542649

2、连贯操作(链式操作)

(见手册--数据库--查询构造器--链式操作)

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

一条sql语句的组成可以很复杂,里边有where、order by、group by、限制查询的字段、limit、having限制条件等等,这些复杂的条件在tp框架中都有封装

注:TP框架中,中间的方法没有顺序要求,当时用于获取最终结果的find和select等方法,必须在最后。

常用链式操作方法

$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();

连表查询:SELECT * FROM tpshop_goodspics g LEFT JOIN tpshop_goods gs on g.goods_id = gs.id;

$data = \app\admin\model\Goods::where('id', '>', 32)->field('id, goods_name')->order('id desc')->limit(5)->select();
dump($data);

3、统计查询(聚合查询)

见手册--模型--聚合,或者手册--数据库--查询构造器--聚合查询

在模型中也可以调用数据库的聚合方法进行查询:

方法 说明
count 统计数量,参数是要统计的字段名(可选)
max 获取最大值,参数是要统计的字段名(必须)
min 获取最小值,参数是要统计的字段名(必须)
avg 获取平均值,参数是要统计的字段名(必须)
sum 获取总分,参数是要统计的字段名(必须)

这些方法的返回值是具体的数据。在连贯操作中只能放在最后,不需要使用find和select。

count方法 相当于 select count(*) from tpshop_user;

img

image-20190705223844524

4、数据字段查询

①查询一条记录的一个字段的值

Goods::where(‘id’, 2)->value(‘goods_name’);

②查询多条记录的一个字段的值,返回一个一维索引数组

Goods::where(‘id’, ‘GT’, 2)->column(‘goods_name’);

image-20190705223948463

③查询多条记录的一个字段的值,以id字段值作为数组索引

Goods::where(‘id’, ‘GT’, 2)->column(‘goods_name’, ‘id’);

image-20190705224049887

5、trace调试

Trace调试功能就是ThinkPHP提供给开发人员的一个用于开发调试的辅助工具。可以实时显示当前页面的操作的请求信息、运行情况、SQL执行、错误提示等

开启trace调试:

修改application/config.php , 配置以下参数:

'app_trace' => true

image-20190705224224392

小结练习:

1562397659957

image-20190705224259166

十四、模板中数据的展示(了解)

1、条件判断标签if

TP框架中内置了if标签,用于在模板文件中进行if判断。语法如下:

{if condition="($name == 1) OR ($name > 100) "} value1

{elseif condition="$name eq 2"/}value2

{else /} value3

{/if}

也可以写为以下形式:

{if ($name == 1)}value1

{/if}

2、范围判断标签in

范围判断标签包括in notin between notbetween四个标签,都用于判断变量是否中某个范围。

{in name="id" value="1,2,3"} id在范围内

{/in}

{in name="id" value="$range"} id在范围内

{/in}

Name属性值为变量名,不带$符号

Value属性值可以是字符串范围,也可以是数组变量或者字符串变量。

相当于原生php中的 if(in_array())

3、使用函数

(见手册--模板--使用函数)

在模板文件中输出变量,可以对变量使用函数进行处理

语法:两种语法:

{$变量名称|函数名称=arg1,arg2,###}

参数中,可以使用### 代替输出的变量本身,如果变量本身是第一个参数,可以省略。

示例:

//对时间格式化
{$v.goods_create_time|date='Y-m-d H:i:s', ###}
//对字符串进行md5加密
{$name|md5}

{:函数名称(参数)}

{:date("Y-m-d H:i:s", $v['goods_create_time'])}

凡是php本身的函数或者框架中定义的函数,都可以在模板中直接调用。

4、系统变量

(见手册--模板--系统变量)

TP框架自带了一个$Think变量,用于在模板中输出系统变量。

$Think.server :相当于$_SERVER

$Think.get	:相当于$_GET

$Think.post :相当于$_POST

$Think.request :相当于$_REQUEST

$Think.cookie :相当于$_COOKIE

$Think.session :相当于$_SESSION

$Think.config.名称 :输出配置参数

$Think.const.名称:输出常量

相当于框架帮我们做了以下事情
$Think = [
	'get' => $_GET,
	'post'=>$_POST

];
$this->assign('Think', $Think);

示例:url地址:http://www.tpshop.com/index.php/Admin/Goods/index?page=10

展示page参数值: {$Think.get.page}

5、使用运算符

在模板文件中输出变量时,可以先使用运算符进行运算。

+ 		{$a+$b}

- 		{$a-$b}

* 		{$a*$b}

/		{$a/$b}

%		{$a%$b}  取余或取模

++		{$a++} 或  {++$a}

--		{$a--}  或 {--$a}

十五、数据的添加操作

(见手册--模型--新增) curd : create update read delete

1、添加一条数据(save方法)

img

Save方法返回值是写入的记录数

image-20190705225318404

2、静态方法添加(create方法)

image-20190705225519577

添加数据使用示例:

image-20190705225644153

image-20190705225724244

3、添加多条数据(saveAll方法)

image-20190705225443739

4、过滤非数据表字段

save方法: 调用save方法之前,先调用allowField方法

image-20190705225801739

create方法: 给create方法传递第二个参数,true

User::create($_POST, true);

十六、案例:后台商品添加功能

需求:只添加最基本的信息(商品名称、商品价格、商品数量)

表单展示 Goods控制器create方法(整合模板)

表单提交 Goods控制器save方法

思路: 显示form表单,提交form表单,将数据接收并保存到数据表。

1)功能实现

①确认表单完整性,完善提交地址、name属性值等信息

image-20190705225859278

image-20190705225929058

②修改Goods控制器save方法,接收表单提交并保存数据。

image-20190705230002327

2)知识点

1、模型的时间戳功能

(见手册--模型--时间戳)

image-20190705230038639

注:自动写入时间戳字段,前提是数据表必须有对应的字段存在。

2、页面跳转与重定向

(见手册--控制器--跳转和重定向)

成功时跳转

$this -> success(“提示信息”,“跳转地址”,“返回数据”,“等待时间”,“header信息”);

失败时跳转

$this -> error(“提示信息”,“跳转地址”,“返回数据”,“等待时间”,“header信息”);

等待时间默认3s。 跳转地址可以不写,默认跳转回上一页。

重定向跳转:用于直接跳转,不显示提示信息。

$this -> redirect(“跳转地址”,“请求参数”,“http code”);

十七、Ueditor富文本编辑器

1、Ueditor编辑器的下载

商品的详细描述一般都是图文混合。对于图文混合的内容,需要使用富文本编辑器来实现。

Ueditor富文本编辑器的下载地址:

http://ueditor.baidu.com/website/download.html

image-20190705230140608

下载之后:

image-20190705230249809

解压:

image-20190705230220654

2、Ueditor编辑器的使用

使用步骤:

引入编辑器的代码到项目中

引入js文件

指定标签(携带id属性),编辑器的显示位置

在js中实例化编辑器

注意:使用时,富文本编辑器 分为 普通输入界面,和源代码输入界面。

如果要自己写html代码设置样式,必须点击左上角的html按钮 切换到源代码界面,输入完成后,必须至少点击一次html按钮,否则php中收不到数据的。

案例实现: 商品添加页面 使用ueditor富文本编辑器

将编辑器整合到项目

image-20190705230343801

页面上引入编辑器(参考demo文件index.html)

①引入js文件

image-20190705230408676

②在页面定义标签,id属性,name属性

image-20190705230436979

③使用js代码实例化编辑器

image-20190705230458042

商品描述的添加:

image-20190705230525554

控制器中接收到的 商品描述字段值,是一段html代码字符串。

示例:

<p>test</p><p><img src="/ueditor/php/upload/image/20180804/1533373686.png" title="1533373686.png" alt="b1.png"/></p>

十八、表单验证

对接收的参数,进行格式的检测。

1、验证语法

见手册--验证

TP框架提供了一个\think\Validate验证类:

image-20190705230801461

也可以自定义提示信息

image-20190705230842490

2、内置规则

见手册--验证--内置规则

3、在商品添加功能中,进行表单验证(参数检测)

步骤:

定义验证规则数组$rule

定义提示信息数组$msg

实例化验证类

调用check方法进行验证

代码示例:

image-20190705230926361

image-20190705230951094

4、控制器验证

可以在控制器中,调用validate方法,直接执行验证

image-20190705231012653

总结:

1、配置数据库链接信息

2、定义模型(模型和数据表对应关系,命令行创建模型类)

3、查询操作方法(find selectwhere、统计查询、连贯操作方法)

4、商品列表功能及foreach标签、使用函数语法、url生成、 商品详情页

5、添加操作及商品添加功能(save方法、saveAll方法、静态create、过滤非数据表字段)

6、页面跳转和重定向(success error redirect)

7、整合富文本编辑器到页面

8、表单验证(独立验证语法、控制器验证语法、内置规则)

十九、修改操作

(见手册--模型--更新) (CURD: create update read delete)

1、更新一条数据

1562389513084

1562389566302

使用示例

先查询再更新 和 直接更新 (save方法)

1562389604733

2、批量更新数据

1562389645544

以上用法通常比较少用,更多的批量更新,是使用where条件,一次更新多条数据的指定字段值。

(多条数据的同一个字段,改成同一个值)

\app\admin\model\Goods::where(‘id’, ‘GT’, 40)->update([‘goods_number’ => 100])

3、静态方法更新(推荐)

1562389714724

示例: 直接调用update方法,第三个参数 true 表示过滤非数据表字段

1562389739201

4、自动识别

1562389765533

5、课堂代码示例

1562464748593

1562464774963

二十、案例:后台商品修改功能

表单展示 Goods控制器 edit方法(整合模板)

表单提交 Goods控制器update方法

思路:

①在表单展示 控制器方法中,查询原始的数据

②在表单页面,展示原始数据

③确认表单完整性,完善name属性和提交地址等信息,主键id隐藏域

④在表单提交的控制器方法中,接收数据

⑤参数检测(表单验证)

⑥将数据修改到数据表

⑦页面跳转。

1、页面展示

①修改Goods控制器edit方法,查询原始商品数据

1562389794930

②修改view/goods/edit.html ,将原始数据展示到input输入框的value上

1562389815198

2、表单提交

③确认表单完整性,完善提交地址和name属性值等。

1562389837689

④修改view/goods/edit.html ,添加隐藏域,保存当前商品记录的主键id值

1562389862948

⑤修改Goods控制器update方法,接收表单提交并保存数据

1562389882463

添加数据验证

1562389931714

1562389967784

3、ueditor富文本编辑器整合

①引入js文件

1562389992649

②定义标签,id属性、name属性

1562390009993

③使用js代码实例化编辑器

1562390034828

廿一、删除操作

(见手册--模型--删除、手册--模型--软删除)

1、删除操作

①先查询,再调用模型的delete方法删除

$user = User::get(1);
$user ->delete();

②先调用where方法,再调用Query类的delete方法删除

User::where(‘id’, 1)->delete();

③静态调用destroy方法删除(推荐)

User::destroy(1);
User::destroy(‘1,2,3’);
User::destroy([1,2,3]);
User::destroy([‘status’=>1]);

delete方法使用示例

课堂示例

1562468570027

1562468607198

原笔记示例

1562390163270

a.先查询再删除

b.使用where条件,调用Query类的delete方法删除

c.静态调用destroy方法进行删除

删除效果:将指定的数据从数据表直接删除,返回值都是受影响的记录条数

2、trait

(见手册--架构--Traits引入)

1562390240562

1)初识trait

trait A{
	public function getName()
	{
		return 'This is trait';
	}
}

trait的定义,和类非常相似,只需要将关键字class换成trait即可。

2)trait的使用

定义trait之后,在一个类中进行使用。

class B{
	use A;
}
$b = new B();
echo $b->getName(); //This is trait

1562390286542

3)trait、类与继承

trait A{
    public function getName()
    {
        return 'A-getName';
    }
    
    public function getAge()
    {
        return 'A-getAge';
    }
}

class C{
    public function getName()
    {
        return 'C-getName';
    }

    public function getAge()
    {
        return 'C-getAge';
    }

    public function getSex()
    {
        return 'C-getSex';
    }
}

class B extends C{

    //使用trait
    use A;

    public function getAge()
    {
        return 'B-getAge';
    }

    public function getSex()

    {
        return 'B-getSex';
    }
}
$b = new B();
echo $b->getSex();//B-getSex
echo $b->getName();//A-getName
echo $b->getAge();//B-getAge

注:有同名方法,当前类方法 会覆盖 trait的方法,trait的方法会覆盖继承类的方法。

更多使用,见php手册

1562390384743

TP中的trait:

父类控制器Controller中使用了Jump这个trait,提供了页面跳转相关方法。

模型的SoftDelete这个trait,需要在自定义模型中,手动使用,提供的是软删除相关功能。

3、软删除

物理(硬)删除:真删除, 从数据表直接删除记录。

逻辑(软)删除:假删除(本质是修改操作),只是让数据在页面不显示,数据表中仍然保留。

原理:在数据表添加一个字段控制数据在页面的展示。点击删除操作时,修改对应字段的值。

软删除:(见手册--模型--软删除)

img

1562390446171

SoftDelete这个trait的位置:

1562390492016

软删除的使用示例:

在模型中进行设置

1562390514825

廿二、案例完成后台的商品删除功能

1、设置模型的软删除

(前面已经设置过)

1562390565048

2、软删除功能实现

1562390601999

3、增删改查操作小结

见admin/Curd控制器。 核心代码(15-20行)

4、id参数检测

1562390674433

廿三、登录登出权限控制

1、封装密码加密函数

注意:后台管理员表tpshop_manager中 初始的管理员密码

密码要自己加密一个初始密码,更新到数据表

使用自定义的密码加密函数:

1562390706278

随意找一个控制器的方法,使用加密函数对一个自定义的初始密码进行加密输出。

1562390736353

效果:

1562390752384

将此加密后的密码,复制,修改到tpshop_manager表的passwod字段。

2、模板中使用请求参数

(见手册--模板--请求参数)

1562390796317

示例:{$Request.url} 获取当前页面的url地址

1562390832611

3、TP中的cookie和session

(见手册--杂项--cookie,手册--杂项--session)

TP框架提供了think\Cookie类和think\Session类分别操作cookie和session.

也可以使用助手函数cookie()和session()。

session函数使用语法:

1562391044797

![img](file:///C:\Users\asus\AppData\Local\Temp\ksohtml\wpsDB7D.tmp.jpg)

session函数基本操作

session('name', 'thinkphp');  //设置
session('name');	//读取
session('name', null);	//删除单个session
session(null);	//删除所有session

session函数 点语法

//数组用法 点语法
session('user', ['username'=>'hua', 'age'=>30]);
//使用点语法 直接操作数组中的一个键值对
session('user.email', 'hua@qq.com');
dump(session('user'));
//直接取数组中的一个键值对
dump(session('user.email'));
//删除数组中的一个值
session('user.email', null);
dump(session('user.email'));

cookie函数使用语法:

1562390941081

使用示例:

1562391128189

img

4、完成后台的登录功能

需要创建Manager模型:

命令行方式: php think make:model admin/Manager

思路:

①表单展示

②表单中的name属性值、提交地址

③提交的控制器方法中,接收数据

④查询用户表 验证用户名和密码

⑤用户名和密码正确,设置登录标识到session 跳转到后台首页

⑥用户名或密码错误,报错,返回登录页面

路径:Login控制器login方法

①确认form表单完整性,完善name属性和提交地址

1562391209268

②修改Login控制器login方法,接收表单提交并处理

判断请求方式(一个方法,处理两个业务逻辑:表单展示、表单提交)

1562391232068

表单提交post请求

1562391256766

1562391295273

登录成功,一定要设置登录标识到session。

注:where方法的使用 手册--数据库--查询构造器--高级查询

5、完成后台的登出功能

①在后台的Login控制器新增logout方法

1562391336041

②修改退出入口的链接地址

在view/layout.html修改对应链接地址。

1562484377666

③页面入口

1562391374061

6、后台页面权限控制(越权访问--FQ)

①在Admin模块Controller目录,新增一层Base控制器

session(‘?name’) 表示 判断session中是否设置name,返回值是true和false;

1562391400683

②所有后台其他的控制器都需要继承Base控制器(Login控制器例外

比如Index控制器、Goods控制器等

1562391425651

1562391455398

注:相同命名空间下的类,互相访问时,可以不用携带命名空间。

廿四、验证码技术

1、使用验证码的步骤

①生成验证码图片,展示在页面上

②点击图片刷新验证码功能

③提交表单后验证码的校验

2、TP中的验证码显示

(见手册--杂项--验证码)

1562391489524

img

1562391547123

验证码包的位置:

1562391567476

①修改配置application\config.php

1562391600798

②修改view/login/login.html 验证码图片img标签src属性

1562391611949

③点击刷新验证码图片

修改view/login/login.html,验证码图片img标签,绑定onclick事件,给src地址加随机数

1562391639935

3、验证码的校验

修改Login控制器login方法:表单提交后,先进行验证码校验,再查询数据表

1562491082532

4、验证码标识

当项目中有多个功能都需要使用验证码(比如登录页、找回密码页等),可以对验证码设置标识。

以登录页为例,可修改代码如下:

验证码标识:字符串 'login'

①验证码显示

修改view/login/login.html 验证码图片img标签src属性 给captcha_src函数传参数 ‘login’

1562496019970

②点击刷新验证码图片

修改view/login/login.html,验证码图片img标签,绑定的onclick事件 给captcha_src函数传参数 ‘login’

1562496074393

③验证码的校验

修改Login控制器login方法:表单提交后,先进行验证码校验,再查询数据表

给captcha_check函数或者captcha验证规则 传参数 ‘login’

1562496204558

总结:

1、修改操作以及后台商品修改功能(save方法、saveAll方法、静态update方法

2、删除操作(delete方法、destroy方法)与软删除功能、trait

3、cookie和session操作(助手函数)

4、登录模块功能(登录、退出、登录检测)

5、验证码(captcha_src() captcha_img() captcha_check())

注意点:

管理员列表: 不显示密码

管理员添加:用户名、密码(加密)、邮箱、昵称等

管理员修改:用户名不能修改;可以改 密码(重置别人的密码)、邮箱、昵称等

管理员删除:不能删除admin管理员

修改密码(修改自己的面)

廿五、分页功能

1、原理

(见手册--杂项--分页)

一般在列表页数据展示时,如果数据太多,需要进行分页展示。

分页原理:核心是使用sql语句中的limit限制条件

分页的实现分为两部分:一个是分页栏链接html代码,一个是当前页数据查询。

TP中分页实现,可以使用模型的分页查询功能

1562558918079

TP框架中底层和分页相关的类文件:(了解、不需要修改代码

thinkphp\library\think\Paginator.php

1562558962121

分页驱动thinkphp\library\think\paginator\driver\bootstrap.php

1562559045900

2、商品列表分页展示

具体实现:

①修改Goods控制器index方法,使用模型分页查询功能查询数据

1562559081864

②修改view/goods/index.html,遍历展示数据,展示分页栏代码

遍历展示数据(之前写好的可以不用修改

1562559111867

展示分页栏代码(修改一行代码

1562559165495

③默认分页栏代码没有样式(可能会受到当前模板中的样式影响),可以自行写样式。

1562559213635

样式代码如下:

<style type="text/css">
    .pagination li{list-style:none;float:left;margin-left:10px;
        padding:0 10px;
        background-color:#5a98de;
        border:1px solid #ccc;
        height:26px;
        line-height:26px;
        cursor:pointer;color:#fff;
    }
    .pagination li a{color:white;padding: 0;line-height: inherit;border: none;}
    .pagination li a:hover{background-color: #5a98de;}
    .pagination li.active{background-color:white;color:gray;}
    .pagination li.disabled{background-color:white;color:gray;}
</style>

页面效果:

1562559273428

如果要修改 上一页 下一页 中文显示:需要修改Bootstrap.php

1562559317024

3、分页+搜索

①修改view/goods/index.html,查找功能的表单,提交地址、输入框name属性

1562638417457

②修改Goods控制器index方法,接收查询关键字,使用模型分页查询功能,传递第三个参数

1562638473320

廿六、文件上传

1、原理&语法

(见手册--杂项--上传,见手册--杂项--文件处理)

文件上传本身支持上传各种类型的文件,包括图片、视频、压缩包等。

比如:商城项目中商品都需要有图片展示,这些图片需要使用文件上传功能。

文件上传功能的原理:

将上传的文件保存到服务器指定位置;

将服务器上文件的访问路径保存到数据表。

①TP中的文件上传:(底层使用了\think\File类)

单文件上传

1562559371056

多文件上传:

1562559429511

上传验证:

1562559456441

上传规则:默认情况下,会在上传目录下面生成以当前日期为子目录,以微秒时间的md5编码为文件名的文件。

1562559493572

②文件上传大小限制:各个地方的限制,以最小的为准。

文件上传功能,需要在php.ini中确认允许上传的文件大小限制:可根据实际情况自行修改。

Post请求最大限制:

img

文件上传最大限制:

img

2、商品logo图片上传

思路:

①修改form表单:文件上传域及name值,form标签的enctype属性

②在控制器对文件进行处理,将文件保存在指定目录,将文件保存路径存到数据表

功能实现:

①修改view/goods/create.html ,给商品logo图片文件上传域添加name属性

确保form表单有enctype属性

1562561525727

②修改Goods控制器save方法,处理文件上传

思考:添加和修改功能都有商品logo图片上传,可以将商品logo图片的上传功能,封装成Goods控制器的一个私有upload_logo方法,需要时直接调用。

Goods控制器save方法中调用私有的upload_logo方法:

1562561557823

注:需要创建文件上传对应目录结构 public/uploads目录

Goods控制器save方法直接调用upload_logo方法

将返回值加到$data数组中即可。

1562561586418

注意:文件的路径写法;

在php中,凡是使用函数对文件的处理,路径要么使用./相对路径,要么使用从盘符开始的完整路径。

在html页面展示图片或者引入静态资源文件,使用/方式的路径。

3、商品logo图片修改

修改功能中,也有logo图片上传功能

确认表单完整性,修改view/goods/edit.html, 添加name值logo

1562561608657

在Goods控制器update方法中,调用upload_logo方法实现

需要添加一个判断:如果有图片上传,则进行图片字段的修改

1562642176962

廿七、缩略图生成

(见手册--杂项--图像处理)

给网站上传的图片,通常生成一张缩略图,用于前台展示。

原因:前台页面图片很多,如果图片太大,网页加载慢,服务器压力大。

在TP中提供了一个图像处理类库\think\Image,其中的包含生成缩略图的方法。

img

Image类的使用:缩略图生成:

静态调用Image类open方法打开一个图片

调用thumb方法生成缩略图

调用save保存缩略图

注意:Open方法和save方法,参数是文件的路径,要么是./方式,要么是完整路径。

代码实现:在商品logo图片上传成功后,对其生成缩略图

修改Goods控制器upload_logo方法,使用Image类生成缩略图

1562561706728

由于生成缩略图之后,原始图片没用了,所以用缩略图覆盖了原始图片。

廿八、DB方式操作数据库(了解)

(见手册--数据库--查询构造器)

TP框架中,模型是基于Db类的,最底层使用的是PDO。

TP框架中,操作数据库,除了使用模型外,还可以直接使用think\Db类。

示例:

查询数据: find方法 和select方法

img

添加数据:

img

更新数据:

img

删除数据:

img

table方法用于指定完整表名称。 name方法指定不包含前缀的表名称

使用Db类进行增删改查,示例见admin模块 Db控制器

可以使用的链式操作方法见(手册--数据库--查询构造器--链式操作)

注意:使用Db类时,不能调用模型封装的方法,比如all方法,get方法。

原生sql的执行:

1562561849240

示例:

1562561885340

1562561924012

1562561942441

廿九、Composer基本使用

学习目标:

①安装配置composer

②使用composer安装ThinkPHP5.0框架项目和扩展包

1. 介绍

官网:https://getcomposer.org/

中文官网:https://www.phpcomposer.com/

Composer是 PHP 用来管理依赖(dependency)关系的工具。

通俗来说,composer是PHP用来下载并自动安装外部类库文件到项目中的工具。

1562561972080

2. 安装

1562561996878

安装程序见资料目录:

img

安装过程需要联网: 打开安装文件,一直 下一步 安装 即可(中间可能需要手动选择本地php.exe路径)。

img

安装完成,在命令行窗口,执行 composer命令,会出现以下提示。

img

3. 配置镜像

一般情况下,安装包的数据一般是从 github.com 、 packagist.org 上下载的,国外的网站连接速度很慢。“Packagist 中国全量镜像”所做的就是缓存所有安装包和元数据到国内的机房,这样就不必再去向国外的网站发起请求

镜像官网:

https://pkg.phpcomposer.com/

img

配置方式:在命令行窗口下执行以下命令

composer config -g repo.packagist composer https://packagist.phpcomposer.com

1562562145734

4. composer安装项目

可以使用composer安装ThinkPHP5.0框架项目

安装命令: composer create-project topthink/think shop

create-project:代表我们要下载项目文件(非功能包)

topthink/think:thinkphp5项目的名称(packagist应用市场起好的)

shop: 在当前目录会自动创建shop目录并存储下载下来的框架代码文件

以上命令执行完毕,就会在当前目录下创建shop目录,并把thinkphp5框架源码下载进去

示例:

1562562166684

效果:安装的是适配本地环境的最新版本tp框架

img

5. composer安装项目的扩展

项目中可能需要使用一些功能扩展,比如图片验证码扩展 topthink/think-captcha

项目根目录 > composer require 大名/小名 版本号

下载安装扩展(先切换到项目根目录)

项目根目录> composer require "topthink/think-captcha"  1.*

示例:

切换到项目根目录:

img

安装图片验证码扩展

img

扩展包安装位置:

img

6、基本使用-小结

①安装composer: 双击Composer-Setup.exe进行安装。

②配置镜像:执行命令

composer config -g repo.packagist composer https://packagist.phpcomposer.com

③安装项目:执行命令(以ThinkPHP5.0框架为例)

composer create-project topthink/think shop

④安装项目扩展包:项目根目录下,执行命令(以图片验证码扩展为例)

composer require topthink/think-captcha 1.*

7、composer的常用命令

install命令 和 update命令

composer install

根据 composer.lock 文件中记录的 软件列表及版本信息 进行安装。

如果没有composer.lock文件,

composer update

根据composer.json文件重新安装最新的版本。

如果要安装一个新的扩展,可以使用composer require 进行安装。

也可以 将安装包信息,添加到composer.json, 使用composer update进行安装。

工作中:给到大家的项目代码,通常是不包含vendor目录,只会包含composer.json和composer.lock

如果有composer.lock ,则使用composer install命令进行安装。

如果没有composer.lock, 则使用composer update 命令进行安装。

三十、注册路由

1、路由简介

什么是路由:

将用户的请求按照事先规划的方案提交给指定的控制器或者功能函数来进行处理.

img

2、路由模式

见手册--路由--路由模式

ThinkPHP5.0的路由比较灵活,并且不需要强制定义,可以总结归纳为如下三种方式:

普通模式、混合模式、强制模式。

强制模式下,系统中的每次请求都不是随意的,必须要做相关的设置,该请求才被允许,这样做的好处是系统相对比较安全、路由非常规范、有利于整体协调配置等。

配置方式:开启路由模式(application/config.php)

普通模式

'url_route_on'  =>  false,		//开启路由设置
'url_route_must'=>  false,		//必须使用路由

混合模式

'url_route_on'  =>  true,		//开启路由设置
'url_route_must'=>  false,		//必须使用路由

强制模式

'url_route_on'  =>  true,		//开启路由设置
'url_route_must'=>  true,		//必须使用路由

3、路由定义(路由注册)

设置路由(application/route.php)

格式:

Route::rule('路由表达式','路由地址','请求类型','路由参数(数组)','变量规则(数组)');

//简化格式:

Route::get('路由表达式','路由地址','路由参数(数组)','变量规则(数组)');

Route::post('路由表达式','路由地址','路由参数(数组)','变量规则(数组)');

Route::any('路由表达式','路由地址','路由参数(数组)','变量规则(数组)');

参数说明:

路由表达式:请求地址(比如在浏览器地址栏输入的地址)

路由地址:表示路由表达式最终需要路由到的地址(比如模块/控制器/方法),有多种定义方式,常用的是”模块/控制器/操作?额外参数1=值1&额外参数2=值2”形式

请求类型:GET、POST ,大写

路由参数

method:请求类型

ext:允许的后缀

deny_ext:禁止的访问后缀

domain:允许什么样的域名访问有效

https:检测是否是https请求

before_behavior:行为发生前,进行路由检查

after_behavior:行为发生后,要执行的动作

...

详情参考:手册--路由--路由参数

变量规则:检查传递的变量是否符合某个(正则)规则,规则可以通过正则定义

例如:

Route::rule('login','home/login/login','GET',['ext'=>'html']);
访问:http://servername/index.php/login.html
路由到:http://servername/index.php/home/login/login

//路由变量
Route::rule('login/:id','home/login/login','GET',['ext'=>'html'],['id'=>'\d+']);
访问:http://servername/index.php/login/101.html
路由到:http://servername/index.php/home/login/login/id/101

Route::rule('login/:id/:name','home/login/login','GET',['ext'=>'html'],['id'=>'\d+','name'=>'[a-zA-Z]+']);
访问:http://servername/index.php/login/101/tom.html
路由到:http://servername/index.php/home/login/login/id/101/name/tom

使用示例:

课堂示例:

1562660444808

原笔记:

1562562788490

4、路由分组

路由分组功能允许把相同前缀的路由定义合并分组,这样可以提高路由匹配的效率,不必每次都去遍历完整的路由规则。

路由分组:

Route::group(‘分组名称’, function(){

​ //单个路由的定义

});

使用示例:

1562562823070

5、组合变量

如果路由中的变量,不想使用 /:变量名 的方式定义,可以使用 <变量名> 组合变量。

1562562841395

6、TP中路由与伪静态

TP5框架中,伪静态(让访问url看起来像是访问的静态html地址,实际上访问到的是php)的实现:

1、隐藏入口文件(使用apache的url重写机制)

2、伪静态后缀 .html (框架默认可以加后缀)

3、路由注册(简化路由写法)

7、资源路由

1562662855746

1562662875639

Route::resource('goods', 'admin/goods');
//对应商品的访问地址
//列表  get请求  http://域名/goods  
//添加页面  get请求  http://域名/goods/create

8、域名路由

1562663497731

① 配置一个虚拟站点 比如 admin.tpshop.com 还是指向项目的public目录

②修改配置文件application/config.php

'url_domain_deploy' => true

③注册域名路由 application/route.php

\think\Route::domain('admin', 'admin');

1562663640925

其他

1、防止表单重复提交

见手册-验证-表单令牌

场景1:网速慢的情况,表单提交按钮可以重复点击

场景2:ajax请求,发送请求按钮可以重复点击

解决办法:使用TP框架的表单令牌功能

原理:生成一个token字符串,session中保存一次,页面中放一个;

页面发送请求时携带token字符串,控制器中进行验证,验证成功后重置。

生成token两种语法:

①{:token()} 生成一个隐藏域, 存放token令牌;

得到 形似以下的代码

<input type="hidden" name="__token__" value="dsargsafdsafdsagsa">

②{$Request.token} 生成token值

<input type="hidden" name="__token__" value="{$Request.token}">

控制器中对token进行校验:

使用表单验证,在任何一个字段的验证规则中,加上 “token”规则

$rule = ['name' => 'require|token'];

ajax请求 需要手动生成token, 加token参数

var data = {“_token_”:”{$Request.token}”};

示例:1562563041200

1562563055791

总结:

  1. 分页+查找 paginate方法
  2. 文件上传 (请求对象的file方法、文件对象的validate方法、move方法、getSaveName方法)
  3. 缩略图生成(\think\Image::open()->thumb()->save())
  4. 了解Db方式操作数据库(执行原生sql等)
  5. Composer基本使用。
  6. 注册路由(路由定义、路由分组、资源路由、域名路由)
  7. 防止表单重复提交(token令牌)