精华内容
下载资源
问答
  • tp5框架完整版

    2018-03-14 11:16:09
    tp5框架的完整版!解压即可使用,简便,快捷,实用。包涵基层
  • tp5集成workerman中的getwayworker网页版及时通讯聊天系统,想学习tp5和workerman初学者们的首选
  • 基于最新layui和thinkphp5做的后台,功能强大,界面好看,适合用于开发,拿来就可以直接写功能模块了
  • tp5+后台管理系统(权限管理系统已经实现),利用tp框架,这个非常好用,小编一直在用
  • tp5

    千次阅读 2018-03-26 12:58:52
    ThinkPHP-5教程简介 相关链接:https://www.kancloud.cn/manual/thinkphp5/118003 环境准备必备环境 上面的环境扩展信息必须在php.ini进行开启,同时还需要将php.exe加入到环境变量中(TP5里面也提供了类似...

    ThinkPHP-5教程

    简介

     

     

     

    相关链接:

    https://www.kancloud.cn/manual/thinkphp5/118003

     

    环境准备

    必备环境

     

     

    1. 上面的环境扩展信息必须在php.ini进行开启,同时还需要将php.exe加入到环境变量中(TP5里面也提供了类似laravel里面的artisan命令行功能,所以也要把php.exe加入到环境变量)

     

     

     

    1. 建议使用PHPstudy集成开发环境

     

     

     

    1. 常见php.ini的扩展的开启同时还要开启Apache里面的某些扩展

     

     

     

    1. Apacherewrite模块的开启(到时候TP里面要做为入库文件的隐藏)

     

     

     

    composer安装

    官网:http://www.phpcomposer.com/

    相关文档:https://www.kancloud.cn/thinkphp/composer/35668

    资源包:https://packagist.org/

    无网安装composer软件

     

     

    由于上面的exe安装过程中需要联网进行操作,并且服务器在国外,一般安装不成功,上面的方式不可取。换为下面的方式进行操作。

     

     

    1. 下载对应的composer.phar文件

    下载地址:https://getcomposer.org/download/

     

     

     

    1. 下载一个window的命令行加强工具(cmder),该工具比本身的DOS要强很多倍,并且可以自己配置window的下命令。

    网站:http://cmder.net/

    网站:http://www.cnblogs.com/jadeboy/p/5132423.html

     

     

     

    1. cmder.zip加压到一个非中文非空格的目录

     

     

     

    1. 查找php.exe的绝对路径

     

     

    路径:C:\phpStudy\php\php-7.0.12-nts\php.exe

     

    1. 设置alias别名,可以使用composer命令

     

     

    设置如下内容

    alias composer=C:\phpStudy\php\php-7.0.12-nts\php.exe  C:\dev\cmder\composer.phar $*

     

     

     

    1. 重新打开一个cmder的命令行输入 composer -v

     

     

     

    安装

    composer安装TP5

    TP5手册:https://www.kancloud.cn/manual/thinkphp5

    本地服务器启动方式:php -S localhost:8000 -t

     

    1. 使用composer安装

     

     

    > composer create-project topthink/think local.tp5.com  --prefer-dist

    安装PHPstudywww目录下

     

     

    安装后

     

     

     

     

    1. 使用composer安装后,我们可以使用PHP内置的web服务器来启动项目

    > php -S localhost:8000 -t public

     

     

    访问:

     

     

    注意: PHP内置的web服务器一般也就测试使用,上线肯定不用。

    -S 代表是监听的IP的地址和端口

    -t  代表是网站的根目录

     

    源码包安装TP5

    1. 加压tp5的源码包到虚拟主机目录

     

     


    2. 配置虚拟主机

     

     

     

    1. 修改hosts文件

     

     

     

    1. 修改vhost文件,同时修改AllowOverride All配置,稍后伪静态隐藏入口文件需要开启该配置项

     

     

     

    5. 域名访问效果

     

     

     

     

     

     

    基础

    需要注意: 在新版的TP5里面的,目录的规划和文件的命名有很大的差别(和之前相比)

    开发规范

     

     

     

    主要的变化如下:

    1. 除了类文件的名称需要大写之外,其他的所有的文件和文件夹都使用小写命名。

     

     

    还要类文件,也不需要在使用类后缀(以前写一个控制器 UserController.class.php 现在直接这样写User.php即可)

     

    1. 函数都建议使用下划线的命名方式(get_user_info_by_id)类都是大驼峰的方式,类里面的方法都使用小驼峰

     

    1. 还有配置项都是用小写(以前使用的是大写)

     

     

    目录规范

    在新版的TP5里面的目录变化也是很大的,需要注意。

     

    相关文档:https://www.kancloud.cn/manual/thinkphp5/118008

     

    整体分析

     

     

     

    application目录分析

     

     

    index模块

     

     

    public目录

     

     

    Tp官方的源码目录

     

     

     

     

     

     

    Vendor目录

     

     

     

     

    入口文件

    注意:在Tp5里面的入库文件和Tp3.2是不一样的,需要注意,是在public目录下

     

     

     

    控制器

    系统默认控制器

    1. tp默认控制器文件位置

     

     

    注意:上面是TP默认的控制器的文件的目录,并该控制器文件首字母大写,同时没有类后缀。(以前:UserController.class.php)

     

    2. 如何在浏览器访问该控制器下的方法?

    答:域名/index.php/index模块/index控制器/lst方法,这里TP5使用的phpinfo的模式进行URL的调度。

     

     

     

    3. 效果

     

     

     

     

    自定义控制器编写

    1. index模块的controller控制器文件夹下编写一个自己的Goods.php控制器文件

     

     

     

    2. URL访问

     

     

    注意:如果我们的控制器文件使用的大驼峰方式命名,需要使用下划线方式访问

    1. 定义一个以大驼峰方式命名的类文件

     

     

     

    2. URL访问的时候,直接输入大驼峰方式访问,则报错

     

     

     

    3. 解决:使用下划线方式访问

     

     

    调试模式开启

    1. 修改application/config.php配置文件,将如下的信息更改为true

     

     

     

    1. 开启调试模式后,报错更友好

     

     

     

    视图

    注意:在Tp5里面可以使用两种方式来载入视图

    方式一:

    语法:return view('视图名称', '关联数组,传递给视图的数据')

    控制器代码:

     

     

    视图代码:

     

     

     

    方式二:

    语法:return $this->fetch('视图名称', [关联数组,传递给视图数据]),但需要继承 \think\Controller控制器

    控制器代码:

     

     

    视图代码:

     

     

     

     

    URL和路由

    URL访问

     

     

     

    注意1:在TP5里面,当使用URL进行访问的时候,地址栏目的控制器的名称无论是大小还是小写,都会被统一的转换为小写。

     

     

    注意2:如果控制器文件的使用UserInfo形如这样的命名,需要使用下划线访问。如果不希望转换,同时,我们自己写的控制器的访问也不希望转换为小写,可以配置 url_convert = false 即可。

     

     

    以后访问大驼峰的方式,则不会报错。

     

     

    GET参数处理

    URL访问

     

     

    代码

     

     

     

    隐藏入口文件

     

     

    1. 需要开启ApacheRewrite模块

     

     

    1. 开启虚拟主机的AllowOverride All

     

     

    1. 在网站根目录添加.htaccess文件

     

     

    内容参考:

     

     

     

    访问效果:

     

     

    注意:通过上面的操作,我们可以非常方便的隐藏入口文件,但是URL地址还是很长,是否可以进一步的优化,便于SEO。可以使用TP5里面的路由进行完成。

     

     

    路由定义

    注意1: Tp5里面,路由并不是必须的,不使用路由的情况下,照样可以使用pathinfo的方式进行访问。

    例如:域名/[index.php入口文件]/index模块名称/index控制器名称/lst方法名称/get参数

     

    注意2也可以开始Tp5的路由和pathinfo同时一起使用。修改配置文件进行开启

     

     

     

    注意3路由文件位置:application/route.php文件

     

    案例一最简单的路由

    1. application/route.php文件定义规则

     

     

     

    1. 定义处理路由请求的控制器和方法

     

     

     

    3. 效果

     

     

    对于上面的操作,我们发现goods后面的数字一般代表是某件商品的主键ID,一般这个不是写死。如果写死了,访问其他的商品信息,则立马报错(例如范围的是15

     

     

     

    案例二-路由参数

    1. 定义路由参数是可以变的

     

     

     

    1. 在控制器的方法里面获取参数

     

     

    案例三-路由类

    除了上面的方式可以定义路由外,还有其他的方式定义路由,使用系统自带的Route路由类

    1. 路由定义

     

     

     

    1. 控制器方法定义

     

     

    效果

     

     

    案例四-闭包处理

    对于上面的这种路由类的定义,我们还可以使用闭包函数进行响应。

    1. 定义路由规则

     

     

     

    1. 创建视图文件(public/view下)

     

     

    效果

     

     

     

     

     

     

    URL分隔符

    TP5里面的URL的分隔符默认使用的/ ,可以通过配置 pathinfo_depr 参数改变。

     

     

     

     

    1. 修改配置文件的 pathinfo_depr

     

     

    访问

     

     

     

     

    路由参数

    单独在建立一个Blog的控制器文件,然后处理某年某月的日志博客,可以使用TP里面自带的命令行工具建立控制器。

    url: http://local.tp.com/blog-2015-12 ===> 某个控制器下的方法

     

     

    月份正则:http://blog.csdn.net/ljsososo/article/details/16898541

     

     

    路由分组

    方式一:

     

     

     

    方式二:

     

     

     

    其他的路由

    resource资源路由:其他的如get或者是post

     

     

     

    手册提供

     

     

     

    请求和响应

    请求

    TP5里面接收用户的请求数据可以使用如下的方式进行处理:

    1. Request的实例

    a) $request = Request::instance()

    1. 在控制器里面继承基类控制器

    a) $this->request()->param('参数')

    1. 使用 input() 函数(注意: 在TP5里面已经不能在使用Tp3.2里面的I函数)
    2. 参数的依赖注入

     

     

     

     

    注意:在TP5里面IS_GET、IS_POST等常量已经不存在

    如果要获取,则需要使用Request实例进行方法获取

     

     

    响应

    视图载入

     

     

     

    提示信息-成功和错误

    1. 定义路由

     

     

    1. 展示添加表单

     

     

    3. User控制器的add方法里面完成处理

     

     

    注意:TP5里面已经不再使用U函数了。

     

    url函数

    TP5里面url地址的生成需要使用url函数,在Tp3.2里面的U函数已经不能在Tp5里面进行使用了。

    方式一:

     

     

    效果:

     

     

     

    方式二:

     

     

    效果:

     

     

     

    方式三:参数的另外一种方式

     

     

    效果:

     

     

     

    方式四:使用系统内部的Url类进行生产URL地址

     

     

    效果:

     

     

     

     

     

    重定向

     

     

    直接跳转,不给提示信息

     

     

    返回数据类型

    注意:默认情况下,TP5里面返回的是html文本信息,如果我们期望返回的是json格式的数据,则需要修改配置文件

     

     

    控制器下的方法:

     

     

    浏览器效果

     

     

     

    json中文转义

     

     

    效果

     

     

    文档:http://blog.csdn.net/default7/article/details/38123201

     

    TP5自带json函数

     

     

    效果:

     

     

    json函数源码

     

     

     

     

     

    数据库操作-DB

    学习手册

     

     

     

    数据库配置

     

     

     

    注意1TP里面,可以在模块下面单独的建立一个database.php配置文件,代表这个模块就使用配置的这个数据库

     

     

     

    注意2我们可以在config.php里面配置多个数据信息也是可以的

     

     

     

    数据库操作-查询

    先在控制器引入Db

     

     

    使用Db类的query方法即可

     

     

    查询也可以使用占位符

     

     

     

    数据库操作-增删改

    使用Db类的execute方法

     

     

     

    数据库切换

    1. application/config.php里面配置一个db1的数据库信息

     

     

    1. 使用Db::connect('db1') 获取 dedecms数据库里面的数据

     

     

     

     

     

    手册:

     

     

     

     

    构造器-查询

     

    方式一:获取所有的数据

     

     

    效果

     

     

     

    方式二:获取单条数据(a. 根据主键 b.查询条件)

     

     

    效果

     

     

    例如:查询用户名为caoyang的记录

     

     

     

    构造器-添加

     

     

     

    构造器-更新

     

     

    构造器-删除

     

     

     

    别名处理

    对于上面的查询构造器,使用的是Db::table(表前缀的表名),可以换一种方式来不写表前缀

    Db::name('不要表前缀的表名')

     

     

    建议使用Db::name()方法调用

     

    助手函数

    在新版TP5里面已经不存在M()函数(tp3.2的时候可以帮我们实例化系统的模型)使用的是db()帮助函数进行替换

    db('不要前缀的表名')->select();

     

     

     

    闭包查询

    db('admin')->select(function($query){

    // $query里面可以设置查询的条件

    });

     

     

     

    使用Query对象查询

    有点类似laravel里面的查询构造器

     

     

     

     

    模型学习

    MVC里面,M是负责对数据的处理,其实在TP5里面模型封装的已经很好了,基本上我们不用做过多的操作,使用系统自带的基类即可完成大部分的curd操作。

     

     

    模型定义

    需要写在模块的model目录下,我们可以使用TP5自带的命令行工具进行生成。

    注意1:在TP5里面模型也不在使用类后缀,直接就是使用去除表前缀后的名称作为模型的名称。(模型名称使用大驼峰的方式)

    例如:表的名称为 sh_admin 对应的模型文件名称 Admin.php

    例如:表的名称为 sh_goods_attribute 对应的模型文件名称 GoodsAttribute.php

     

    >php think make:model app\index\model\User

     

     

    创建后

     

     

     

     

    定义sh_user表

    上面的模型和下面的sh_user是对应的

     

     

    基本操作-增加

    完成数据的增加主要有如下几种方法

    1. 模型对象的save方法(先为对象设置属性)
    2. 模型类的create静态方法
    3. 模型对象的saveAll批量添加方法

     

     

    实操:

    1.模型对象的save方法(先为对象设置属性)

     

     

    2.模型类的create静态方法【简化操作】

     

     

    3.模型对象的saveAll批量添加方法【上面的两种操作,都只能完成单条数据的插入,如果批量插入数据,需要使用模型对象的saveAll方法】

     

     

     

    基本操作-查看

    查询数据主要有如下几种方法

    1. 模型类的get静态方法【存在返回值为对象,否则为null
    2. 通过字段查询getByFieldname()方法
    3. 根据条件查询get(['username' => 'root'])
    4. where方法查询->find()
    5. where方法查询->select()
    6. 模型类的all静态方法和select静态方法

     

    实操:

    1.模型类的get静态方法【存在返回值为对象,否则为null】,通过传递主键获取数据

     

     

    效果

     

     

    2.根据条件查询get(['username' => 'root'])

    方式一:

     

     

    方式二:使用where方法传递(需要注意后面要通过find()方法调用一下)

     

     

     

    3.通过模型对象的字段查询getByFieldname('查询条件')方法

     

     

     

    1. 模型类的where方法查询,然后调用find()方法

     

     

     

    5.where方法查询->select()

    方式一:

     

     

    方式二:

     

     

     

    6.模型类的all静态方法和select静态方法

     

     

    注意:对应allselect方法返回的数据,是一个数组,数组中的每个元素是一个模型对象,如果我们需要把他们转换为普通的二维数组(数组中的元素也是数组)

     

     

    效果:

     

     

     

    便捷方式获取模型实例

    在新版的Tp5里面可以有如下两种便捷方式获取模型实例:

    方式一:使用model助手函数

     

     

     

    方式二:使用TP5自带的Loader类的model静态方法

     

     

     

    总结:在新版的TP5里面,在原先TP3.2里面的单字母函数D已经不存在,取而代之的是model函数。

     

    基本操作-更新

    更新数据主要有如下几种方法

    1. get(),后save()

    2.模型类update静态方法

     

     

    实操:

    1.先调用模型类的get()静态方法,然后在调用模型对象的save()方法

     

     

    2.模型类update静态方法

    方式一:

     

     

    方式二:

     

     

     

    基本操作-删除

    删除数据主要有如下几种方法

    1.先使用模型类的get()静态方法,然后在使用模型对象的delete()方法

    2.模型类destroy静态方法

     

     

    实操:

    1. 先使用模型类的get()静态方法,然后在使用模型对象的delete()方法

     

     

    2.模型类destroy静态方法

     

     

    3.使用destroy同时删除多条数据

     

     

    4.模型对象的delete方法进行删除(需要传递删除条件)

     

     

     

    相关文档

    网站:https://www.kancloud.cn/manual/thinkphp5/135186

     

    模型关联

    注意:在TP里面的模型关联没有laravel里面那么好用,简单的了解即可,一般来说,还是建议自己在代码里面完成模型间的关系处理。不要过来的依赖模型关联。

     

    TP里面主要是定义三种模型关联类型:

     

    一对一

    简介

    注意:一对一的关系是可以在一张表里面完成的,但是一般来说,数据有冷热之分,热数据(查询频繁的数据,应该单独的抽取称为一张表,水平方向字段数应该尽可能的少)冷数据(查询较少的数据,单独的放在另外的一张表里面进行操作,通过一个外键和热数据表进行关联。例如下面的表里面的是通过sh_profile表里面的user_id产生的关联。)

     

    场景:例如一个用户存在一个具体的用户履历信息

    sh_user 用户表

    id

    username

    passsword

    email

    1

    caoyang

    admin88

    gogery@163.com

    3

    andy

    admin88

    andy@sina.com

     

    sh_profile 履历表

    id

    user_id

    address

    card_id

    education

    ......

    23

    1

    深圳市

    421023112

    本科

    ........

    34

    3

    广州市

    7754123123

    硕士

     

     

    自己手工的连表查询:

    > select a.*, b.address  from sh_user a left join sh_profile b on a.id = b.user_id where a.id = 3;

     

    关联查询

    1. 建立用户表和履历表

     

     

     

    1. 创建User.phpProfile.php模型文件,并在User.php模型文件里面定义模型关联信息

     

     

    履历表模型

     

     

     

    1. 查询关联信息

     

     

    效果:

     

     

    对于上面的操作,完全可以自己写sql完成

     

     

     

    百度:链式操作

    http://www.thinkphp.cn/topic/43233.html

     

     

     

    关联添加

    1. 完全可以自己去在代码里面完成,没必要依赖TP的关联模型

     

     

     

    1. 使用Tp的关联模型进行数据的添加

     

     

     

    一对多

    简介

    一对多的模型还是很常见的,一般解决方法就是增加一张附加表,然后在附加表里面增加一个关联字段。

    常见:一个用户可以存在多本书籍。

    sh_user表:

    id

    username

    passsword

    email

    1

    caoyang

    admin88

    gogery@163.com

    3

    andy

    admin88

    andy@sina.com

     

    sh_book

    id

    user_id

    img

    author

    title

    ....

    1

    3

    1.jpg

    莫言

    分录肥臀

     

    3

    3

    3.jpg

    西红柿

    斗战

     

     

    关联查询

    1. 创建book模型,并且在user模型里面定义关联关系

     

     

    定义关系

     

     

     

    1. 构造测试数据

     

     

     

    1. 查询数据

     

     

    关联添加

    1. 不依赖TP的关联模型,自己手工的解决

     

     

     

    1. 使用Tp的关联模型完成

     

     

     

    多对多

    文档:https://www.kancloud.cn/manual/thinkphp5/142359

    自动验证

    相关文档:https://www.kancloud.cn/manual/thinkphp5/129319

     

    场景:用户的添加的时候完成自动验证,在TP5里面可以使用多种方式完成验证操作。

     

    验证类文件-方式一

    1. 在模块下建立一个validate目录,编写对应的验证类(类文件的名称和模型名称一致)

     

     

    1. 在控制器中使用模型对象的validate方法调用

     

     

    效果

     

     

    验证类文件-方式二

     

     

     

    控制器验证-方式一

    1. 调用控制器的$this->validate(验证数据,验证类名称)方法

     

     

     

     

    控制器验证-方式二

    1.调用控制器的$this->validate(验证数据,验证的规则)方法

     

     

    注意:验证通过返回true,否则返回错误的提示信息

    注意:如果用户想自定义验证提示信息,则可以传递第三个参数

     

     

    系统验证类的使用

    在有的时候我们不希望自己定义验证类来处理,可以使用系统自带的Validate类进行验证

     

     

    验证类的静态方法

     

     

    演示

     

     

     

    验证场景

    TP里面使用了一种叫做验证场景的概念,针对不同的场合使用不同的验证,例如:在添加的时候有添加的验证规则;在更新的时候有更新的规则

     

     

     

    表单验证

    主要是为了防止外站提交(csrf攻击)

    解决:

    1. 在服务器返回表单信息的之前,生成一个唯一的密钥,然后在表单里面的隐藏域里面存放一下,同时还要把数据存到session里面一下。

    2. 用户填完信息后,点击提交后,检测用户表单隐藏域里面的密钥和session里面的时候一样,一样则没有伪造提交(外站提交)

     

    实现:

    1. 在提交表单里面使用token()函数生成一个隐藏域

     

     

     

    1. 在自动验证里面进行验证

     

     

    -dateFormat验证规则

    TP5如果需要验证某个时间数据,可以指定验证个还是,我们可以使用dateFormat规则,同时为其传递一个验证的规则字符串。

     

     

    查看Validate底层的dateFormat方法

     

     

    相关文档:

    http://code.ziqiangxuetang.com/php/func-date-parse-from-format.html

     

    SQL调试

    本地调试模式开启

     

     

    修改config.php配置文件即可

     

     

    打印最后执行的sql

     

     

     

    杂项-验证码

    在完成验证之前,先做一个简答的后台的登录页面 主要是学习验证码和自动生成

     

    验证码

    1. 使用composer下载TP官方提供的验证的类库

    composer require topthink/think-captcha

     

     

    下载后位置

     

     

     

    1. 开启路由规则(因为官方提供的验证类库里面需要使用到路由)

     

     

     

    1. 在控制器里面进行验证处理(提供两种方式)

     

     

     

     

    验证码配置

    1. 在模块的extra目录下增加一个captcha.php配置文件

     

     

    1. 书写配置项

     

     

    具体的配置项目

     

     

    源码分析

    1. 验证码源码的目录

     

     

    1. 查看一下帮助函数

     

     

     

     

     

    1. 验证路由和规则扩展

     

     

     

    1. 验证码生成

     

     

     

    杂项-上传

    TP5里面实现文件上传是很简单的

     

    1. 定义一个表单

     

     

     

    1. 在控制器的方法里面完成上传的处理

     

     

    验证

     

     

    直接调用file对象validate方法即可

     

     

     

    上传文件的命名

    默认的文件的目录命名是的当前的日期,文件的名称是的md5

     

     

     

    1. 修改默认的命名方式位sha1

     

     

    效果

     

     

     

    1. 修改默认的命名方式位uniqid函数

     

     

    效果

     

     

     

     

     

    命令行工具

    控制器生成

    语法一:

    >  php think make:controller  app/index/controller/Blog

     

     

    可以在applicationindex模块下建立一个Blog控制器

     

     

     

     

    语法二:

    >  php think make:controller  app/index/controller/Blog --plain

     

     

    生成的控制器代码里面没有任何的方法

     

     

     

    模型生成

    语法一:

     

     

     

     

    模块生成

    定义build_admin.php文件,规定生成内容

     

     

    语法:

    > php think build --config build_admin.php

     

     

    查看内容

     

     

     

     

     

     

     

     

    Session机制

     

     

    Session初始化

     

     

    一般来说我们不需要手工的进行设置,TP5会在第一次调用Session类的时候进行初始化操作。

     

    读取Session数据

     

     

    通过Request类型的实例的session可以进行session的操作

     

     

     

     

     

     

    操作session

    系统提供的Session类主要有如下几个方法来操作session

    1. set方法:设置
    2. get方法:获取
    3. has方法:判断是否存在某个key
    4. delete方法:删除某个key
    5. clear方法:清空
    6. flash方法:设置一次性session
    7. flush方法:清空

     

     

    助手函数

     

     

    模板输出

     

     

    session驱动

     

     

     

     

    Cookie机制

    cookie初始化

     

     

     

    cookie操作

     

     

     

    助手函数

     

     

    模板输出

     

     

     

    注意:3.25.0的区别

    tp3tp5之间还是有些区别的,需要注意的是,从开发者的角度来说,tp底层是改了很多东西。对于使用者来说,更多的是写法上的一些变化。

    相关文档:http://www.cnblogs.com/wupeiky/p/5850108.html

     

    控制器调用载入视图

     

     

     

    单字母函数去除

     

     

    常见助手函数

     

     

     

     

    获取某个字段的值

     

     

    控制器不区分URL大小写

     

     

    标签语法转换

     

     

    控制器和模型类后缀

     

     

    请求对象和响应对象和常量去除

     

     

     

    展开全文
  • tp5和tp3.2的区别

    万次阅读 2018-07-27 15:50:26
    万变不离其宗,tp5和tp3.2虽说是差别很大,但是套路大家都懂得。只要我们了解了他们的区别,再去学tp5,岂不是如鱼得水。 好,那我们来了解一下tp5和tp3.2的区别。 1,入口文件的绑定 我们都知道thinkphp是一个单...

    万变不离其宗,tp5和tp3.2虽说是差别很大,但是套路大家都懂得。只要我们了解了他们的区别,再去学tp5,岂不是如鱼得水。

    好,那我们来了解一下tp5和tp3.2的区别。

    1,入口文件的绑定

    我们都知道thinkphp是一个单入口框架,它所有的请求都通过public/index.php进入,如果我们正常情况下,我们默认访问的是index模块下的Index控制器下的index方法,如果我们现在想访问index.php或者是我们在这个地方再新建一个其它的文件,我们能不能将这个文件,直接绑定到某个模块?

    我们在入口文件(public/index.php)中添加如下代码(注意顺序一定是这样的),他就会通过index.php,自动访问home模块

    // 定义应用目录
    define('APP_PATH', __DIR__ . '/../application/');
    // 绑定到index模块
    define('BIND_MODULE','home');
    // 加载框架引导文件
    require __DIR__ . '/../thinkphp/start.php';

    如果我的网站开发给第三方,那么我肯定不期望第三方访问我的index模块和admin模块,这样我们只需要在index.php入口文件的同级建一个api.php,然后在api.php中绑定api模块,这样我们访问public/api.php直接访问api模块,别的模块访问不了。

    此外,在thinkphp/convention.php中有一个 ‘auto_bind_module’,我们把它改成true,开启了入口文件自动绑定,也可以实现同样的操作

    2.URL和路由的变化

    thinkphp/convention.php找到url_route_on和url_route_must,是配置路由是否开启和是否强制使用路由。

    我们使用默认配置,然后找到public/route.php文件

    return [
        'test/:id'      => 'index/test'
    ];

    配置好路由,就可以通过指定路由访问。

    3.请求对象Request和响应对象Response

    5.0新增了请求对象Request和响应对象Response,Request统一处理请求和获取请求信息,Response对象负责输出客户端或者浏览器响应。

    tp5中我们有三种方法可以让我们获得Request对象

    1,框架提供的一个助手函数request()

    2,是通过think下的Request类来获取它的实例

    3,直接注入Request对象

    具体获取参数方法如下:

    <?php 
    namespace api\index\controller; 
    use think\Request; 
    class Index 
    { 
      public function index(Request $request) 
      { 
        # 获取浏览器输入框的值 
        dump($request->domain()); 
        dump($request->pathinfo()); 
        dump($request->path()); 
          
        # 请求类型 
        dump($request->method()); 
        dump($request->isGet()); 
        dump($request->isPost()); 
        dump($request->isAjax()); 
          
        # 请求的参数 
        dump($request->get()); 
        dump($request->param()); 
        dump($request->post()); 
        //session('name', 'onestopweb'); 
        //cookie('email', 'onestopweb@163.com'); 
        //session(null); 
        //cookie('email',null); 
        dump($request->session()); 
        dump($request->cookie()); 
          
        dump($request->param('type')); 
        dump($request->cookie('email')); 
          
        # 获取模块 控制器 操作 
        dump($request->module()); 
        dump($request->controller()); 
        dump($request->action()); 
          
        # 获取URL 
        dump($request->url()); 
        dump($request->baseUrl()); 
      } 
    } 

    4,数据库操作

    tp5.0助手函数废除了单字母函数,改用助手函数

    M->db

    调用数据表:

    M('User')->where(['name'=>'thinkphp'])->find();(3.2)
    
    db('User')->where('name'=>'thinkphp')->find();(5.0)

    D->model

    实例化模型的使用:

    D('User')->where(['name'=>'thinkphp'])->find();
    
    model('User')->where(['name'=>'thinkphp'])->find();
    
    //或者
    $UserModel =new User();
    
    $UserModel->where(['name'=>'thinkphp'])->find();

    U->url

    IS_Get->Request::instance()->isGet();
    
    IS_POST->Request::instance()->isPost();

    I->input(代替)

    5,在控制器中正确的输出模板

    如果你继承think\Controller的话,可以使用:

    return $this->fetch('index/hello');

    如果你的控制器没有继承 think\Controller的话,使用:

    return view('index/hello');

    6.常量

    5.0版本废弃了原来的大部分常量定义,仅仅保留了框架的路径常量定义,其余的常量可以使用App类或者Request类的相关属性或者方法来完成,或者自己重新定义需要的常量。
    废除的常量包括:
    REQUEST_METHOD、IS_GET IS_POST、IS_PUT、IS_DELETE、IS_AJAX __EXT__、COMMON_MODULE 、MODULE_NAME、CONTROLLER_NAME、ACTION_NAME、APP_NAMESPACE、APP_DEBUG、MODULE_PATH

    当然一些常用的常量可以自己定义,如定义路径常量

    在application/config.php,或者在模块下新建一个config.php。

    return [
    	'view_replace_str' =>[
    		'__HOME__' => '/static/home',
    	]
    ];
    

    我们还是可以方便的引入和替换一些css,js 文件

    7.模板继承

    模板继承是一项更加灵活的模板布局方式,模板继承不同于模板布局,甚至来说,应该在模板布局的上层。模板继承其实并不难理解,就好比类的继承一样,模板也可以定义一个基础模板(或者是布局),并且其中定义相关的区块(block),然后继承(extend)该基础模板的子模板中就可以对基础模板中定义的区块进行重载。

    因此,模板继承的优势其实是设计基础模板中的区块(block)和子模板中替换这些区块。

    每个区块由{block} {/block}标签组成。 下面就是基础模板中的一个典型的区块设计(用于设计网站标题):

    {block name="title"}<title>网站标题</title>{/block}
    

    block标签必须指定name属性来标识当前区块的名称,这个标识在当前模板中应该是唯一的,block标签中可以包含任何模板内容,包括其他标签和变量,例如:

    {block name="title"}<title>{$web_title}</title>{/block}
    

    你甚至还可以在区块中加载外部文件:

    {block name="include"}{include file="Public:header" /}{/block}
    

    一个模板中可以定义任意多个名称标识不重复的区块,例如下面定义了一个base.html基础模板:

    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>{block name="title"}标题{/block}</title>
    </head>
    <body>
    {block name="menu"}菜单{/block}
    {block name="left"}左边分栏{/block}
    {block name="main"}主内容{/block}
    {block name="right"}右边分栏{/block}
    {block name="footer"}底部{/block}
    </body>
    </html>
    

    然后我们在子模板(其实是当前操作的入口模板)中使用继承:

    {extend name="base" /}
    {block name="title"}{$title}{/block}
    {block name="menu"}
    <a href="/" >首页</a>
    <a href="/info/" >资讯</a>
    <a href="/bbs/" >论坛</a>
    {/block}
    {block name="left"}{/block}
    {block name="main"}
    {volist name="list" id="vo"}
    <a href="/new/{$vo.id}">{$vo.title}</a><br/>
     {$vo.content}
    {/volist}
    {/block}
    {block name="right"}
     最新资讯:
    {volist name="news" id="new"}
    <a href="/new/{$new.id}">{$new.title}</a><br/>
    {/volist}
    {/block}
    {block name="footer"}
    {__block__}
     @ThinkPHP 版权所有
    {/block}
    

    上例中,我们可以看到在子模板中使用了extend标签来继承了base模板

    8,标签

    tp5.0标签默认使用{ },3.2是< >,变量输出使用普通标签就足够了,但是要完成其他的控制、循环和判断功能,就需要借助模板引擎的标签库功能了,系统内置标签库的所有标签无需引入标签库即可直接使用。

    内置标签包括:

    标签名作用包含属性
    include包含外部模板文件(闭合)file
    load导入资源文件(闭合 包括js css import别名)file,href,type,value,basepath
    volist循环数组数据输出name,id,offset,length,key,mod
    foreach数组或对象遍历输出name,item,key
    forFor循环数据输出name,from,to,before,step
    switch分支判断输出name
    case分支判断输出(必须和switch配套使用)value,break
    default默认情况输出(闭合 必须和switch配套使用)
    compare比较输出(包括eq neq lt gt egt elt heq nheq等别名)name,value,type
    range范围判断输出(包括in notin between notbetween别名)name,value,type
    present判断是否赋值name
    notpresent判断是否尚未赋值name
    empty判断数据是否为空name
    notempty判断数据是否不为空name
    defined判断常量是否定义name
    notdefined判断常量是否未定义name
    define常量定义(闭合)name,value
    assign变量赋值(闭合)name,value
    if条件判断输出condition
    elseif条件判断输出(闭合 必须和if标签配套使用)condition
    else条件不成立输出(闭合 可用于其他标签)
    php使用php代码
    展开全文
  • TP5框架青春少年

    千次阅读 2018-11-09 15:00:15
    上面的环境扩展信息必须在php.ini进行开启,同时还需要将php.exe加入到环境变量中(TP5里面也提供了类似laravel里面的artisan命令行功能,所以也要把php.exe加入到环境变量) 1.建议使用PHPstudy集成开...

    ThinkPHP-5教程
    在这里插入图片描述
    相关链接:

    https://www.kancloud.cn/manual/thinkphp5/118003

    环境准备
    必备环境

    在这里插入图片描述

    1. 上面的环境扩展信息必须在php.ini进行开启,同时还需要将php.exe加入到环境变量中(TP5里面也提供了类似laravel里面的artisan命令行功能,所以也要把php.exe加入到环境变量)
      在这里插入图片描述

    1.建议使用PHPstudy集成开发环境
    在这里插入图片描述

    1.常见php.ini的扩展的开启同时还要开启Apache里面的某些扩展

    在这里插入图片描述

    1.Apache的rewrite模块的开启(到时候TP里面要做为入库文件的隐藏)
    在这里插入图片描述

    composer安装
    官网:http://www.phpcomposer.com/

    相关文档:https://www.kancloud.cn/thinkphp/composer/35668

    资源包:https://packagist.org/

    无网安装composer软件
    在这里插入图片描述

    由于上面的exe安装过程中需要联网进行操作,并且服务器在国外,一般安装不成功,上面的方式不可取。换为下面的方式进行操作。

    1.下载对应的composer.phar文件
    下载地址:https://getcomposer.org/download/
    在这里插入图片描述

    1.下载一个window的命令行加强工具(cmder),该工具比本身的DOS要强很多倍,并且可以自己配置window的下命令。
    网站:http://cmder.net/

    网站:http://www.cnblogs.com/jadeboy/p/5132423.html
    在这里插入图片描述

    1.将cmder.zip加压到一个非中文非空格的目录
    在这里插入图片描述

    1.查找php.exe的绝对路径
    在这里插入图片描述

    路径:C:\phpStudy\php\php-7.0.12-nts\php.exe

    1.设置alias别名,可以使用composer命令
    在这里插入图片描述

    设置如下内容

    alias composer=C:\phpStudy\php\php-7.0.12-nts\php.exe C:\dev\cmder\composer.phar $*

    在这里插入图片描述

    1.重新打开一个cmder的命令行输入 composer -v
    在这里插入图片描述

    安装
    composer安装TP5
    TP5手册:https://www.kancloud.cn/manual/thinkphp5

    本地服务器启动方式:php -S localhost:8000 -t

    1.使用composer安装
    在这里插入图片描述

    composer create-project topthink/think local.tp5.com --prefer-dist

    安装PHPstudy的www目录下
    在这里插入图片描述

    安装后
    在这里插入图片描述

    1.使用composer安装后,我们可以使用PHP内置的web服务器来启动项目

    php -S localhost:8000 -t public

    在这里插入图片描述

    访问:
    在这里插入图片描述

    注意: PHP内置的web服务器一般也就测试使用,上线肯定不用。

    -S 代表是监听的IP的地址和端口

    -t 代表是网站的根目录

    源码包安装TP5
    1.加压tp5的源码包到虚拟主机目录
    在这里插入图片描述

    2.配置虚拟主机
    在这里插入图片描述

    在这里插入图片描述

    1.修改hosts文件
    在这里插入图片描述

    1.修改vhost文件,同时修改AllowOverride All配置,稍后伪静态隐藏入口文件需要开启该配置项
    在这里插入图片描述

    2.域名访问效果
    在这里插入图片描述

    基础
    需要注意: 在新版的TP5里面的,目录的规划和文件的命名有很大的差别(和之前相比)

    开发规范

    在这里插入图片描述

    主要的变化如下:
    1.除了类文件的名称需要大写之外,其他的所有的文件和文件夹都使用小写命名。
    在这里插入图片描述

    还要类文件,也不需要在使用类后缀(以前写一个控制器 UserController.class.php 现在直接这样写User.php即可)

    1.函数都建议使用下划线的命名方式(get_user_info_by_id)类都是大驼峰的方式,类里面的方法都使用小驼峰

    1.还有配置项都是用小写(以前使用的是大写)

    目录规范
    在新版的TP5里面的目录变化也是很大的,需要注意。

    相关文档:https://www.kancloud.cn/manual/thinkphp5/118008

    整体分析
    在这里插入图片描述

    application目录分析
    在这里插入图片描述

    index模块
    在这里插入图片描述

    public目录
    在这里插入图片描述

    Tp官方的源码目录
    在这里插入图片描述

    在这里插入图片描述

    Vendor目录
    在这里插入图片描述

    入口文件
    注意:在Tp5里面的入库文件和Tp3.2是不一样的,需要注意,是在public目录下。
    在这里插入图片描述

    控制器
    系统默认控制器

    1. tp默认控制器文件位置
      在这里插入图片描述

    注意:上面是TP默认的控制器的文件的目录,并该控制器文件首字母大写,同时没有类后缀。(以前://UserController.class.php)

    1. 如何在浏览器访问该控制器下的方法?
      答:域名/index.php/index模块/index控制器/lst方法,这里TP5使用的phpinfo的模式进行URL的调度。

    在这里插入图片描述

    1. 效果
      在这里插入图片描述

    自定义控制器编写
    4. 在index模块的controller控制器文件夹下编写一个自己的Goods.php控制器文件
    在这里插入图片描述

    1. URL访问
      在这里插入图片描述

    注意:如果我们的控制器文件使用的大驼峰方式命名,需要使用下划线方式访问

    1. 定义一个以大驼峰方式命名的类文件
      在这里插入图片描述

    2. URL访问的时候,直接输入大驼峰方式访问,则报错
      在这里插入图片描述

    3.解决:使用下划线方式访问
    在这里插入图片描述

    调试模式开启

    1. 修改application/config.php配置文件,将如下的信息更改为true
      在这里插入图片描述

    1.开启调试模式后,报错更友好
    在这里插入图片描述

    视图
    注意:在Tp5里面可以使用两种方式来载入视图:

    方式一:

    语法:return view(‘视图名称’, ‘关联数组,传递给视图的数据’)

    控制器代码:

    在这里插入图片描述

    视图代码:
    在这里插入图片描述

    方式二:

    语法:return $this->fetch(‘视图名称’, [关联数组,传递给视图数据]),但需要继承 \think\Controller控制器

    控制器代码:
    在这里插入图片描述

    视图代码:
    在这里插入图片描述

    URL和路由
    URL访问

    在这里插入图片描述

    注意1:在TP5里面,当使用URL进行访问的时候,地址栏目的控制器的名称无论是大小还是小写,都会被统一的转换为小写。

    注意2:如果控制器文件的使用UserInfo形如这样的命名,需要使用下划线访问。如果不希望转换,同时,我们自己写的控制器的访问也不希望转换为小写,可以配置 url_convert = false 即可。

    在这里插入图片描述

    以后访问大驼峰的方式,则不会报错。
    在这里插入图片描述

    GET参数处理
    URL访问
    在这里插入图片描述

    代码
    在这里插入图片描述

    隐藏入口文件

    在这里插入图片描述

    1.需要开启Apache的Rewrite模块
    在这里插入图片描述

    1.开启虚拟主机的AllowOverride All
    在这里插入图片描述

    1.在网站根目录添加.htaccess文件
    在这里插入图片描述

    内容参考:
    在这里插入图片描述

    访问效果:
    在这里插入图片描述

    注意:通过上面的操作,我们可以非常方便的隐藏入口文件,但是URL地址还是很长,是否可以进一步的优化,便于SEO。可以使用TP5里面的路由进行完成。

    路由定义
    注意1: 在Tp5里面,路由并不是必须的,不使用路由的情况下,照样可以使用pathinfo的方式进行访问。

    例如:域名/[index.php入口文件]/index模块名称/index控制器名称/lst方法名称/get参数

    注意2:也可以开始Tp5的路由和pathinfo同时一起使用。修改配置文件进行开启
    在这里插入图片描述

    注意3:路由文件位置:application/route.php文件

    案例一最简单的路由
    1.在application/route.php文件定义规则
    在这里插入图片描述

    1.定义处理路由请求的控制器和方法
    在这里插入图片描述

    1. 效果
      在这里插入图片描述

    对于上面的操作,我们发现goods后面的数字一般代表是某件商品的主键ID,一般这个不是写死。如果写死了,访问其他的商品信息,则立马报错(例如范围的是15)
    在这里插入图片描述

    案例二-路由参数

    1. 定义路由参数是可以变的
      在这里插入图片描述

    1.在控制器的方法里面获取参数
    在这里插入图片描述

    案例三-路由类
    除了上面的方式可以定义路由外,还有其他的方式定义路由,使用系统自带的Route路由类

    1. 路由定义
      在这里插入图片描述

    1.控制器方法定义
    在这里插入图片描述

    效果
    在这里插入图片描述

    案例四-闭包处理
    对于上面的这种路由类的定义,我们还可以使用闭包函数进行响应。

    1. 定义路由规则
      在这里插入图片描述

    1.创建视图文件(public/view下)
    在这里插入图片描述

    效果
    在这里插入图片描述

    URL分隔符

    在TP5里面的URL的分隔符默认使用的/ ,可以通过配置 pathinfo_depr 参数改变。
    在这里插入图片描述

    1.修改配置文件的 pathinfo_depr
    在这里插入图片描述

    访问
    在这里插入图片描述

    路由参数

    单独在建立一个Blog的控制器文件,然后处理某年某月的日志博客,可以使用TP里面自带的命令行工具建立控制器。

    url: http://local.tp.com/blog-2015-12 ===> 某个控制器下的方法

    在这里插入图片描述

    月份正则:http://blog.csdn.net/ljsososo/article/details/16898541

    路由分组
    方式一:

    在这里插入图片描述

    方式二:
    在这里插入图片描述

    其他的路由

    resource资源路由:其他的如get或者是post
    在这里插入图片描述

    手册提供
    在这里插入图片描述

    请求和响应
    请求
    在TP5里面接收用户的请求数据可以使用如下的方式进行处理:

    Request的实例
    a) $request = Request::instance()

    在控制器里面继承基类控制器
    a) $this->request()->param(‘参数’)

    使用 input() 函数(注意: 在TP5里面已经不能在使用Tp3.2里面的I函数)
    参数的依赖注入

    在这里插入图片描述

    注意:在TP5里面IS_GET、IS_POST等常量已经不存在
    如果要获取,则需要使用Request实例进行方法获取
    在这里插入图片描述

    响应
    视图载入
    在这里插入图片描述

    提示信息-成功和错误
    1.定义路由
    在这里插入图片描述

    1.展示添加表单
    在这里插入图片描述

    3.在User控制器的add方法里面完成处理
    在这里插入图片描述

    注意:TP5里面已经不再使用U函数了。

    url函数
    在TP5里面url地址的生成需要使用url函数,在Tp3.2里面的U函数已经不能在Tp5里面进行使用了。

    方式一:
    在这里插入图片描述

    效果:
    在这里插入图片描述

    方式二:
    在这里插入图片描述

    效果:
    在这里插入图片描述

    方式三:参数的另外一种方式
    在这里插入图片描述

    效果:

    在这里插入图片描述

    方式四:使用系统内部的Url类进行生产URL地址
    在这里插入图片描述

    效果:
    在这里插入图片描述

    重定向
    在这里插入图片描述

    直接跳转,不给提示信息

    返回数据类型

    注意:默认情况下,TP5里面返回的是html文本信息,如果我们期望返回的是json格式的数据,则需要修改配置文件

    在这里插入图片描述

    控制器下的方法:
    在这里插入图片描述

    浏览器效果
    在这里插入图片描述

    json中文转义
    在这里插入图片描述

    效果
    在这里插入图片描述

    文档:http://blog.csdn.net/default7/article/details/38123201

    TP5自带json函数
    在这里插入图片描述

    效果:
    在这里插入图片描述

    json函数源码
    在这里插入图片描述

    数据库操作-DB类

    学习手册

    在这里插入图片描述

    数据库配置
    在这里插入图片描述

    注意1:在TP里面,可以在模块下面单独的建立一个database.php配置文件,代表这个模块就使用配置的这个数据库
    在这里插入图片描述

    注意2:我们可以在config.php里面配置多个数据信息也是可以的
    在这里插入图片描述

    数据库操作-查询

    先在控制器引入Db类
    在这里插入图片描述

    使用Db类的query方法即可
    在这里插入图片描述

    查询也可以使用占位符
    在这里插入图片描述

    数据库操作-增删改

    使用Db类的execute方法
    在这里插入图片描述

    数据库切换
    在application/config.php里面配置一个db1的数据库信息
    在这里插入图片描述

    1.使用Db::connect(‘db1’) 获取 dedecms数据库里面的数据
    在这里插入图片描述
    在这里插入图片描述

    手册:
    在这里插入图片描述

    构造器-查询

    方式一:获取所有的数据
    在这里插入图片描述

    效果

    在这里插入图片描述

    方式二:获取单条数据(a. 根据主键 b.查询条件)
    在这里插入图片描述

    效果
    在这里插入图片描述

    例如:查询用户名为caoyang的记录
    在这里插入图片描述

    构造器-添加
    在这里插入图片描述

    构造器-更新
    在这里插入图片描述

    构造器-删除
    在这里插入图片描述

    别名处理

    对于上面的查询构造器,使用的是Db::table(表前缀的表名),可以换一种方式来不写表前缀

    Db::name(‘不要表前缀的表名’)
    在这里插入图片描述
    建议使用Db::name()方法调用

    助手函数

    在新版TP5里面已经不存在M()函数(tp3.2的时候可以帮我们实例化系统的模型)使用的是db()帮助函数进行替换

    db(‘不要前缀的表名’)->select();
    在这里插入图片描述

    闭包查询
    db(‘admin’)->select(function($query){

    // $query里面可以设置查询的条件

    });

    在这里插入图片描述

    使用Query对象查询

    有点类似laravel里面的查询构造器
    在这里插入图片描述

    在这里插入图片描述

    模型学习

    在MVC里面,M是负责对数据的处理,其实在TP5里面模型封装的已经很好了,基本上我们不用做过多的操作,使用系统自带的基类即可完成大部分的curd操作。

    模型定义

    需要写在模块的model目录下,我们可以使用TP5自带的命令行工具进行生成。

    注意1:在TP5里面模型也不在使用类后缀,直接就是使用去除表前缀后的名称作为模型的名称。(模型名称使用大驼峰的方式)

    例如:表的名称为 sh_admin 对应的模型文件名称 Admin.php

    例如:表的名称为 sh_goods_attribute 对应的模型文件名称 GoodsAttribute.php

    php think make:model app\index\model\User

    在这里插入图片描述

    创建后
    在这里插入图片描述

    定义sh_user表

    上面的模型和下面的sh_user是对应的
    在这里插入图片描述

    基本操作-增加

    完成数据的增加主要有如下几种方法

    1.模型对象的save方法(先为对象设置属性)
    2.模型类的create静态方法
    3.模型对象的saveAll批量添加方法

    实操:

    1.模型对象的save方法(先为对象设置属性)
    在这里插入图片描述

    2.模型类的create静态方法【简化操作】
    在这里插入图片描述

    3.模型对象的saveAll批量添加方法【上面的两种操作,都只能完成单条数据的插入,如果批量插入数据,需要使用模型对象的saveAll方法】
    在这里插入图片描述

    基本操作-查看
    查询数据主要有如下几种方法

    1.模型类的get静态方法【存在返回值为对象,否则为null】
    2.通过字段查询getByFieldname()方法
    3.根据条件查询get([‘username’ => ‘root’])
    4.where方法查询->find()
    5.where方法查询->select()
    6.模型类的all静态方法和select静态方法

    实操:

    1.模型类的get静态方法【存在返回值为对象,否则为null】,通过传递主键获取数据

    在这里插入图片描述

    效果
    在这里插入图片描述

    2.根据条件查询get([‘username’ => ‘root’])

    方式一:
    在这里插入图片描述

    方式二:使用where方法传递(需要注意后面要通过find()方法调用一下)

    在这里插入图片描述

    3.通过模型对象的字段查询getByFieldname(‘查询条件’)方法
    在这里插入图片描述

    1.模型类的where方法查询,然后调用find()方法
    在这里插入图片描述

    5.where方法查询->select()

    方式一:
    在这里插入图片描述

    方式二:
    在这里插入图片描述

    6.模型类的all静态方法和select静态方法
    在这里插入图片描述

    注意:对应all和select方法返回的数据,是一个数组,数组中的每个元素是一个模型对象,如果我们需要把他们转换为普通的二维数组(数组中的元素也是数组)

    在这里插入图片描述

    效果:
    在这里插入图片描述

    便捷方式获取模型实例

    在新版的Tp5里面可以有如下两种便捷方式获取模型实例:

    方式一:使用model助手函数
    在这里插入图片描述

    方式二:使用TP5自带的Loader类的model静态方法
    在这里插入图片描述

    总结:在新版的TP5里面,在原先TP3.2里面的单字母函数D已经不存在,取而代之的是model函数。

    基本操作-更新

    更新数据主要有如下几种方法

    1.先 get(),后save()

    2.模型类update静态方法

    实操:

    1.先调用模型类的get()静态方法,然后在调用模型对象的save()方法
    在这里插入图片描述

    2.模型类update静态方法

    方式一:
    在这里插入图片描述

    方式二:
    在这里插入图片描述

    基本操作-删除

    删除数据主要有如下几种方法

    1.先使用模型类的get()静态方法,然后在使用模型对象的delete()方法

    2.模型类destroy静态方法

    实操:

    1. 先使用模型类的get()静态方法,然后在使用模型对象的delete()方法
      在这里插入图片描述

    2.模型类destroy静态方法
    在这里插入图片描述

    3.使用destroy同时删除多条数据
    在这里插入图片描述

    4.模型对象的delete方法进行删除(需要传递删除条件)
    在这里插入图片描述

    相关文档

    网站:https://www.kancloud.cn/manual/thinkphp5/135186

    模型关联

    注意:在TP里面的模型关联没有laravel里面那么好用,简单的了解即可,一般来说,还是建议自己在代码里面完成模型间的关系处理。不要过来的依赖模型关联。

    在TP里面主要是定义三种模型关联类型:

    一对一

    简介
    注意:一对一的关系是可以在一张表里面完成的,但是一般来说,数据有冷热之分,热数据(查询频繁的数据,应该单独的抽取称为一张表,水平方向字段数应该尽可能的少)冷数据(查询较少的数据,单独的放在另外的一张表里面进行操作,通过一个外键和热数据表进行关联。例如下面的表里面的是通过sh_profile表里面的user_id产生的关联。)

    场景:例如一个用户存在一个具体的用户履历信息

    在这里插入图片描述

    自己手工的连表查询:

    select a.*, b.address from sh_user a left join sh_profile b on a.id = b.user_id where a.id = 3;

    关联查询

    1.建立用户表和履历表
    在这里插入图片描述

    1.创建User.php和Profile.php模型文件,并在User.php模型文件里面定义模型关联信息
    在这里插入图片描述

    履历表模型
    在这里插入图片描述

    1.查询关联信息
    在这里插入图片描述

    效果:

    在这里插入图片描述

    对于上面的操作,完全可以自己写sql完成

    在这里插入图片描述

    百度:链式操作

    http://www.thinkphp.cn/topic/43233.html

    在这里插入图片描述

    关联添加

    1. 完全可以自己去在代码里面完成,没必要依赖TP的关联模型。
      在这里插入图片描述

    1.使用Tp的关联模型进行数据的添加
    在这里插入图片描述

    一对多

    简介
    一对多的模型还是很常见的,一般解决方法就是增加一张附加表,然后在附加表里面增加一个关联字段。

    常见:一个用户可以存在多本书籍。

    sh_user表:
    在这里插入图片描述

    关联查询

    1.创建book模型,并且在user模型里面定义关联关系
    在这里插入图片描述

    定义关系

    在这里插入图片描述

    1.构造测试数据
    在这里插入图片描述

    1.查询数据
    在这里插入图片描述

    关联添加

    1. 不依赖TP的关联模型,自己手工的解决
      在这里插入图片描述

    1.使用Tp的关联模型完成

    在这里插入图片描述

    多对多

    文档:https://www.kancloud.cn/manual/thinkphp5/142359

    自动验证

    相关文档:https://www.kancloud.cn/manual/thinkphp5/129319

    场景:用户的添加的时候完成自动验证,在TP5里面可以使用多种方式完成验证操作。

    验证类文件-方式一

    1.在模块下建立一个validate目录,编写对应的验证类(类文件的名称和模型名称一致)

    在这里插入图片描述

    1.在控制器中使用模型对象的validate方法调用
    在这里插入图片描述

    效果
    在这里插入图片描述

    验证类文件-方式二
    在这里插入图片描述

    控制器验证-方式一

    1.调用控制器的$this->validate(验证数据,验证类名称)方法
    在这里插入图片描述

    控制器验证-方式二
    1.调用控制器的$this->validate(验证数据,验证的规则)方法
    在这里插入图片描述

    注意:验证通过返回true,否则返回错误的提示信息

    注意:如果用户想自定义验证提示信息,则可以传递第三个参数

    在这里插入图片描述

    系统验证类的使用

    在有的时候我们不希望自己定义验证类来处理,可以使用系统自带的Validate类进行验证
    在这里插入图片描述

    验证类的静态方法

    在这里插入图片描述

    演示
    在这里插入图片描述

    验证场景

    TP里面使用了一种叫做验证场景的概念,针对不同的场合使用不同的验证,例如:在添加的时候有添加的验证规则;在更新的时候有更新的规则
    在这里插入图片描述

    表单验证

    主要是为了防止外站提交(csrf攻击)

    解决:

    1. 在服务器返回表单信息的之前,生成一个唯一的密钥,然后在表单里面的隐藏域里面存放一下,同时还要把数据存到session里面一下。

    2. 用户填完信息后,点击提交后,检测用户表单隐藏域里面的密钥和session里面的时候一样,一样则没有伪造提交(外站提交)

    实现:

    1. 在提交表单里面使用token()函数生成一个隐藏域
      在这里插入图片描述

    1.在自动验证里面进行验证
    在这里插入图片描述

    坑-dateFormat验证规则

    在TP5如果需要验证某个时间数据,可以指定验证个还是,我们可以使用dateFormat规则,同时为其传递一个验证的规则字符串。

    在这里插入图片描述

    查看Validate底层的dateFormat方法
    在这里插入图片描述

    相关文档:

    http://code.ziqiangxuetang.com/php/func-date-parse-from-format.html

    SQL调试

    本地调试模式开启

    在这里插入图片描述

    修改config.php配置文件即可
    在这里插入图片描述

    打印最后执行的sql
    在这里插入图片描述

    杂项-验证码

    在完成验证之前,先做一个简答的后台的登录页面 主要是学习验证码和自动生成

    验证码

    1.使用composer下载TP官方提供的验证的类库
    composer require topthink/think-captcha
    在这里插入图片描述

    下载后位置

    在这里插入图片描述

    1.开启路由规则(因为官方提供的验证类库里面需要使用到路由)
    在这里插入图片描述

    1.在控制器里面进行验证处理(提供两种方式)
    在这里插入图片描述

    验证码配置

    1.在模块的extra目录下增加一个captcha.php配置文件

    在这里插入图片描述

    1.书写配置项
    在这里插入图片描述

    具体的配置项目
    在这里插入图片描述

    源码分析

    1. 验证码源码的目录
      在这里插入图片描述

    1.查看一下帮助函数
    在这里插入图片描述

    在这里插入图片描述

    1.验证路由和规则扩展
    在这里插入图片描述

    1.验证码生成
    在这里插入图片描述

    杂项-上传

    在TP5里面实现文件上传是很简单的

    1.定义一个表单
    在这里插入图片描述

    1.在控制器的方法里面完成上传的处理
    在这里插入图片描述

    验证

    在这里插入图片描述

    直接调用file对象validate方法即可
    在这里插入图片描述

    上传文件的命名

    默认的文件的目录命名是的当前的日期,文件的名称是的md5

    在这里插入图片描述

    1.修改默认的命名方式位sha1
    在这里插入图片描述

    效果
    在这里插入图片描述

    1.修改默认的命名方式位uniqid函数
    在这里插入图片描述

    效果
    在这里插入图片描述

    命令行工具

    控制器生成

    语法一:

    php think make:controller app/index/controller/Blog

    在这里插入图片描述

    可以在application的index模块下建立一个Blog控制器
    在这里插入图片描述

    语法二:

    php think make:controller app/index/controller/Blog --plain

    在这里插入图片描述

    生成的控制器代码里面没有任何的方法
    在这里插入图片描述

    模型生成

    语法一:

    在这里插入图片描述

    模块生成

    定义build_admin.php文件,规定生成内容
    在这里插入图片描述

    语法:

    php think build --config build_admin.php

    在这里插入图片描述

    查看内容
    在这里插入图片描述

    Session机制

    在这里插入图片描述

    Session初始化

    在这里插入图片描述

    一般来说我们不需要手工的进行设置,TP5会在第一次调用Session类的时候进行初始化操作。

    读取Session数据

    在这里插入图片描述

    通过Request类型的实例的session可以进行session的操作
    在这里插入图片描述

    操作session
    系统提供的Session类主要有如下几个方法来操作session

    1.set方法:设置
    2.get方法:获取
    3.has方法:判断是否存在某个key
    4.delete方法:删除某个key
    5.clear方法:清空
    6.flash方法:设置一次性session
    7.flush方法:清空

    助手函数

    在这里插入图片描述

    模板输出

    在这里插入图片描述

    session驱动

    在这里插入图片描述

    Cookie机制

    cookie初始化

    在这里插入图片描述

    cookie操作

    在这里插入图片描述

    在这里插入图片描述

    助手函数

    在这里插入图片描述

    模板输出

    在这里插入图片描述

    注意:3.2和5.0的区别

    tp3和tp5之间还是有些区别的,需要注意的是,从开发者的角度来说,tp底层是改了很多东西。对于使用者来说,更多的是写法上的一些变化。

    相关文档:http://www.cnblogs.com/wupeiky/p/5850108.html

    控制器调用载入视图

    在这里插入图片描述

    单字母函数去除

    在这里插入图片描述

    常见助手函数

    在这里插入图片描述

    获取某个字段的值

    在这里插入图片描述

    控制器不区分URL大小写

    在这里插入图片描述

    标签语法转换

    在这里插入图片描述

    控制器和模型类后缀

    在这里插入图片描述

    请求对象和响应对象和常量去除

    在这里插入图片描述

    原博文地址:http://www.cnblogs.com/wangyuming/p/7674763.html

    标签: tp5

    展开全文
  • TP5 页面跳转与重定向

    千次阅读 2019-08-19 16:13:37
    return 'TP5学习ing....'; } public function hello($name) { if ($name=='thinkphp') { $this->success('验证成功,正在跳转~~','ok'); } else { $this->error('验证失败,返回登陆页面','login'); } } ...

    一、页面跳转
    如果要使用页面跳转必须要继承基类Controller类,因为基类Controller引入了trait类库,trait类库又实现了success()和error()的跳转方法。
    1、当前控制器
    来到默认模块默认控制器中演示,首先继承自基类Controller,在当前Index控制器中创建一个hello()方法来模拟网站的后台登陆和页面的跳转:

    class Index extends \think\Controller
    {
        public function index()
        {
            return 'TP5学习ing....';
        }
        public function hello($name)
        {
            if ($name=='thinkphp') {
              $this->success('验证成功,正在跳转~~','ok');
            }
            else {
              $this->error('验证失败,返回登陆页面','login');
            }
        }
        public function ok()
        {
            return '欢迎使用本系统';
        }
        public function login()
        {
            return '登陆页面';
        }
    }
    

    根据逻辑,如果访问的url是:http://tp5.com/index/index/hello/name/thinkphp,会执行success()方法,跳转到ok()方法,反之,使用:http://tp5.com/index/index/hello/name/tp5,则会走error()方法,跳转到login()方法。

    2、跨控制器
    首先创建一个新的控制器Login,把Index中的ok()和login()方法剪切到文件中:

    <?php
    namespace app\index\controller;
    class Login extends \think\Controller
    {
      public function ok()
      {
          return '欢迎使用本系统';
      }
      public function login()
      {
          return '登陆页面';
      }
    }
    

    然后,Index控制器也进行修改:

    <?php
    namespace app\index\controller;
    class Index extends \think\Controller
    {
        public function index()
        {
            return 'TP5学习ing....';
        }
        public function hello($name)
        {
            if ($name=='thinkphp') {
              $this->success('验证成功,正在跳转~~','login/ok');
            }
            else {
              $this->error('验证失败,返回登陆页面','login/login');
            }
        }
    }
    

    这样就实现了跨控制器的跳转,我们来验证一下:http://tp5.com/index/index/hello/name/thinkphp和http://tp5.com/index/index/hello/name/tp5都能正常跳转。

    3、跨模块
    首先创建一个demo模块,模块下创建控制器Login.php,把上个例子的Login.php的内容拷贝过去,修改下命名空间,保存。
    然后修改下Index控制器:

    public function hello($name)
    {
        if ($name=='thinkphp') {
          $this->success('验证成功,正在跳转~~','demo/login/ok');
        }
        else {
          $this->error('验证失败,返回登陆页面','demo/login/login');
        }
    }
    

    这样就实现了跨模块的跳转,我们来验证一下:http://tp5.com/index/index/hello/name/thinkphp和http://tp5.com/index/index/hello/name/tp5依旧都能正常跳转。

    4、外部地址
    如果跳转为外部地址的话,记得前提是必须要以协议开头!
    演示也很简单,修改一下error()方法跳转的地址:
    $this->error(‘验证失败,返回登陆页面’,‘http://www.baidu.com’);

    使用http://tp5.com/index/index/hello/name/tp5测试一下,成功跳转到百度。

    补充说明
    补充一下,这个跳转地址,除了可以用字符串的形式外,还可以路由的方式来生成。示例如下:
    $this->success(‘验证成功,正在跳转~~’,\think\Url::build(‘demo/login/ok’));

    如果觉得这样写比较繁琐,还可以通过注入函数进行简化:
    $this->success(‘验证成功,正在跳转~~’,url(‘demo/login/ok’));

    也没有问题。

    二、URL重定向
    使用redirect(路由地址,请求变量,后缀,是否显示域名)方法
    演示一下,因为演示是跳转到同一控制器中的,只需要前两个参数:

    class Index extends \think\Controller
    {
        public function hello($name)
        {
            if ($name=='thinkphp') {
              $this->redirect('ok',['siteName'=>'百度']);
            }
        }
        public function ok($siteName)
        {
          return '成功就会跳转到 '.$siteName.' 网址。';
        }
    }
    

    我们来验证一下:http://tp5.com/index/index/hello/name/thinkphp,可以正常跳转。
    同样的,重定向也支持外部地址:

    public function hello(KaTeX parse error: Expected '}', got 'EOF' at end of input: …ame) { if (name==‘thinkphp’) {
    $this->redirect(‘ok’,[‘siteName’=>‘百度’]);
    }
    else {
    $this->redirect(‘http://www.baidu.com’,302);//302是临时重定向,301是永久重定向
    }
    }

    验证一下:http://tp5.com/index/index/hello/name/tp5,直接重定向到百度了。

    展开全文
  • tp3与tp5的区别

    千次阅读 2019-04-16 03:17:15
    前言不论是学习使用tp3/tp5还是面试,我们经常都会提到thinkPHP3和thinkPHP5的一些区别有哪些,下面我对这两者的一些区别做了一些总结(表面的区别,并不涉及内核)1.控制器输入函数不同在tp3中,我们输出视图是$...
  • tp5 时间戳

    千次阅读 2019-06-28 15:23:02
    获取当前时间: $now = time(); 时间戳转换正常时间格式: date('Y-m-d H:i:s',time()); 日期转换为时间戳: $date="2013-10-01 12:23:14"; dump(strtotime($date)); model模型: 自动写入时间戳字段(true、......
  • TP5漏洞

    千次阅读 2018-12-28 11:32:41
    漏洞POC /index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=... ...TP5漏洞Getshell图形化界面已上传 可查看 参考 https://bbs.ichunqiu.com/thread-48687-1-1.html
  • 目录目标下载安装TP5框架下载运行demo前提准备配置web服务器了解框架结构 目标 下载 TP5 框架并在本地运行出 TP5 默认 demo 下载安装TP5框架 thinkphp 5.0 是为API开发而设计的的高性能框架,虽然发布时间不...
  • TP5添加数据

    千次阅读 2019-05-05 21:34:57
    TP5添加数据 添加一条数据: 使用 Db 类的 insert 方法向数据库提交数据 Db::table('think_user') ->insert([ 'id'=>1, 'name'=>'小明' ]); insert 方法添加数据成功返回添加成功的条数,insert 正常...
  • TP5日志记录与异常处理

    千次阅读 2019-07-02 16:01:44
    TP5默认会记录全部(即使你设置了配置项level),需要手动关闭,然后有选择的来记录日志。 自定义全局日志记录 //首先关闭系统日志记录配置,然后再入口文件最下面添加如下代码 \ think \ Log : : init ...
  • IIS下TP5应该如何配置

    2018-12-13 05:59:59
    求帮忙,简单的IIS已经配置好了,可是我的TP5项目一直打不开,在网上找的一个web.config文件复制到了TP5根目录下面,可是进项目一直提示无法请求页面,该页的相关配置无效,该弄的都弄了,求各位帮帮忙,微信红包...
  • TP5 格式化时间戳

    千次阅读 2020-01-10 15:32:27
    模型查询数据时,需要将时间戳字段自动转为日期格式: class User extends Model { /** * 定义时间戳字段名 * 默认字段为:create_time, update_time * 如果是这两字段就不用再设置,不是则需要设置 ...
  • TP5查询语句

    千次阅读 2019-05-04 21:01:22
    TP5查询语句 查询一个表内的数据: 单个条件: Db::table('think_user')->where('id',1)->find(); 多个条件: Db::table('think_user') ->where([ 'id'=>1, 'sex'=>'男' ])->find(); 只...
  • TP5中session使用

    千次阅读 2019-12-14 14:10:21
    5,指定作用域 // 指定当前作用域 Session::prefix('think'); 7,取值并删除 // 取值并删除 Session::pull('name'); 8,清空 // 清除session(当前作用域) Session::clear(); // 清除think...
  • tp5 自定义分页

    千次阅读 2018-07-10 18:14:23
    由于tp5自带分页实在是不好看,所以就很想自定义一个分页,啥也不说了,直接上代码:1.在tp5框架目录下找到extend文件夹,并创建page文件夹,在page文件夹下中创建Page.php类文件:(下图为tp5框架目录)2、然后复制...
  • 点击进入视频教程tp5控制器一个样例明白控制器的定义及使用;use think\Controller;/** * Class User * @package app\index\controller * @author weiyongqiang * 其实tp5中可以不集成Contr
  • tp5 提升性能小方法

    千次阅读 2019-09-16 11:46:19
    每次有数据要查询时,tp5会都会SHOW COLUMNS去动态获取表下面的信息,增加了性能消耗 所以要生成数据表字段信息缓存,提升数据库查询的性能,避免多余的查询。命令如下: php think optimize:...
  • tp5更新数据

    千次阅读 2019-05-06 21:27:37
    Db::table('think_user')->where('id', 1)->setInc('score', 5); // score 字段减 1 Db::table('think_user')->where('id', 1)->setDec('score'); // score 字段减 5 Db::table('think_user')->where('id', 1)->...
  • tp5 生成静态页面代码

    千次阅读 2019-07-26 11:48:44
    //写入 /*** $filepath 生成静态文件路径 $tpl 模板文件名称 ***/ ... 推荐全站真静态 TP5CMS 系统,hsycms v3.1 连接 http://www.hsycms.com TP5生成静态页面DEMO源码:https://gitee.com/sywlgzs/tp5html  
  • TP5 Echarts图使用

    千次阅读 2019-08-30 11:31:21
    你可以通过几种方式获取 ECharts。 ... ... ... 从官网下载界面选择你需要的版本下载... data: [5, 20, 36, 10, 10, 20] }] }; // 使用刚指定的配置项和数据显示图表。 myChart.setOption(option); 运行结果:
  • Tp3 和 Tp5之间的区别 Tp5版本和Tp3的差异较大的,它们的主要区别: 1.URL和路由 5.0的URL访问不再支持普通URL模式,路由也不支持正则路由定义,而是全部改为规则路由配合变量规则(正则定义)的方式: 主要改进有...
  • tp5,tp6的异同之处

    千次阅读 2020-09-27 11:15:30
    tp5,tp6的异同之处 对比 Tp5 Tp6 目录结构 框架在根目录/thinkphp /vendor/topthink 安装方式 都可以 只能通过composer安装 类自动加载方式 composer+自己的 composer 严格模式 ...
  • TP5自定义命令行详细用法

    千次阅读 2019-03-14 11:32:46
     好在TP5框架中有命令行的功能,我们可以使用TP5的命令行调用我们自定义的命令,从而操作TP5项目中的代码。 定义命令  先简单的定义一个命令,建立一个命令行测试类: namespace app\base\command; use ...
  • 1,入口文件(tp5\public\index.php) 作用: 1)定义目录常量 2)加载框架引导目录 2.加载框架引导文件(tp5\thinkphp\start.php) 作用: 1)引导基础文件 2)对应用进行运转 3.加载框架基础引导文件(tp5\...
  • tp5书写接口

    千次阅读 2018-12-20 10:01:33
    那么使用TP5书写接口,该怎么写呢?接口安全怎么保证? 首先,举一个易懂、简单上手快的接口给大家分享一下: 比如App调用数据进行渲染: 控制器层: public function index() { //引入秘钥 $pwd=new ...
  • TP5 定时任务

    千次阅读 2019-06-18 19:24:14
    1、在需求模块下建立command文件夹,可自定义其他命名,在文件夹当中建立php... ... ...5、建立 test.bat文件 d: cd Project/web D:php\php-7.0.12-nts\php.exe think Task 加入windows计划任务即可  

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 239,254
精华内容 95,701
关键字:

tp5