由此开始:https://www.kancloud.cn/manual/thinkphp6_0/1037479
目录结构:https://www.kancloud.cn/manual/thinkphp6_0/1037483
伪静态设置:https://www.kancloud.cn/manual/thinkphp6_0/1037488
Thinkphp网址导航:http://sites.thinkphp.cn/1556332
open_basedir = /:/tmp/:/proc/,调整PHP目录访问权限;
display_errors = On,打开默认不显示的错误提示;
安装Redis,安装Swoole;
安装think-view模板库: "topthink/think-view":"*";
Nginx解析的根目录改为Thinkphp项目所在的public目录;
Thinkphp伪静态修改好,并重启Nginx;
将runtime、session等需要写入的目录给予可写的权限;
启用Thinkphp的session:app/middleware.php写入;
\think\middleware\SessionInit::class
config/session.php调整session的有效期;
config/middleware.php新增中间件类的别名
'alias' => [
"Token"=>app\middleware\Token::class,
"BusinessToken"=>app\middleware\BusinessToken::class
],
config/database.php,修改数据库相关的配置信息;
config/filesystem.php,修改自带的文件管理库相关配置;
config/app.php ,修改应用相关配置(是否显示错误信息等等);
config/cache.php,配置redis等缓存数据库;
.env,修改调试的相关配置信息;
app/ExceptionHandle.php,修改默认错误信息输出的默认模板;
多应用模式
多应用模式部署后,记得删除app目录下的controller目录(系统根据该目录作为判断是否单应用的依据)。
在mac或者linux环境下面,注意需要设置runtime目录权限为777。
视图的目录规范:https://www.kancloud.cn/manual/thinkphp6_0/1037611
视图模板赋值与输出:https://www.kancloud.cn/manual/thinkphp6_0/1037609
模板开发文档:https://www.kancloud.cn/manual/think-template
// 模板变量赋值
View::assign('name','ThinkPHP');
// 或者批量赋值
View::assign([
'name' => 'ThinkPHP',
'email' => 'thinkphp@qq.com'
]);
// 使用视图输出过滤
return View::filter(function($content){
return str_replace("\r\n",'',$content);
})->fetch();
可以使用View静态方法或者view()助手函数返回的对象;
模板路径:默认情况下,框架会自动定位你的模板文件路径,优先定位应用目录下的view
目录,这种方式的视图目录下就是应用的控制器目录。(app/(多应用时存在的目录)/controller同级目录的view目录/控制器目录/视图.html);第二种方式是视图文件和应用类库文件完全分离,统一放置在根目录下的view
目录。
表示系统会按照默认规则自动定位视图目录下的模板文件,其规则是:控制器名(小写+下划线)/操作名.html。如果有更改模板引擎的view_depr,改为_后就变成控制器_视图.html;
/* 指定模板输出 */
return View::fetch('edit');
/*表示调用当前控制器下面的edit模板*/
return View::fetch('member/read');
/*表示调用Member控制器下面的read模板。*/
return View::fetch('admin@member/edit');
/*表示跨应用调用模板*/
原生查询:https://www.kancloud.cn/manual/thinkphp6_0/1037570
$user=Db::table('$tablename'); /*含前缀*/
$user=Db::name('$name');/*不含前缀*/
在Db类的方法中,name(),会自动加上表前缀,table(),则不会。
链式查询:https://www.kancloud.cn/manual/thinkphp6_0/1037538,如field指定部分字段等等。
select 方法查询结果是一个数据集对象,如果需要转换为数组可以使用(toArray)
find 方法:查询符合条件的第一条数据。select 方法:查询符合条件的所有数据。find只是取一条记录;打印出来的区别只是有个limit 1的限制;
字符串条件查询:whereRaw('type=1 AND status=1'),以及whereOr、whereIn等等
find查询未找到数据是返回null,findOrEmpty未找到数据时返回空数组。insertGetId,插入数据时返回Id
update方法返回影响数据的条数,没修改任何数据返回 0;
fieldRaw方法中可直接使用Mysql函数,fieldRaw('id,SUM(score)');
如果要更新的数据需要使用SQL函数或者其它字段,exp('name','UPPER(name)');
getOptions(),$model_list = User::order();$options = $model_list->getOptions();获取本次查询的条件;
fetchSql(),fetchSql用于直接返回SQL而不是执行查询,适用于任何的CURD操作方法。
buildSql(),返回用于子查询的sql语句
<?php
/* 全局错误处理 */
if ($e instanceof HttpException) {
if ($e->getStatusCode() == 404) {
return json(["code" => 0, "errMsg" => $e->getMessage()])->code(404);
} else {
return json(["code" => 0, "errMsg" => $e->getMessage()]);
}
} else {
return json(["code" => 0, "errMsg" => $e->getMessage()]);
}
}
中间件主要用于拦截或过滤应用的HTTP请求,并进行必要的业务处理。
全局中间件->应用中间件->路由中间件->控制器中间件;
官方文档:https://www.kancloud.cn/manual/thinkphp6_0/1037493
直接使用中间件时需要指定完整的包名+类名,通过middleware.php配置中间件的别名后可直接指定别名。
直接传递参数到控制器;
public function handle($request, \Closure $next)
{
if ('think' == $request->name) {
$request->name = 'ThinkPHP';
}
return $next($request);
}
路由中间件
可以细化到对方法进行中间件控制
什么情况下应该使用事务,当数据库操作结束后,还有其它的非数据库业务流程,失败时数据库操作不应该存在时使用。
Thinkphp6 模型使用事务同DB类一致,实例化后直接调用startTrans、commit、rollback;
回滚只能在Commit之前,Commit之后将无法回滚。
排它锁:Db::name('user')->where('id',1)->lock(true)->find();
共享锁:Db::name('user')->where('id',1)->lock('lock in share mode')->find();
官方文档:https://www.kancloud.cn/manual/thinkphp6_0/1037634
官方提供的方法都比较简单易用,当然也可以自己对\Redis类进行封装;
官方文档:https://www.kancloud.cn/manual/thinkphp6_0/1037494
路由解析的过程一般包含:
路由定义
route目录下的任何路由定义文件都是有效的,分开多个路由定义文件并没有实际的意义,纯粹出于管理方便而已。默认的路由定义文件是route.php,但你完全可以更改文件名,或者添加多个路由定义文件。
├─route 路由定义目录
│ ├─route.php 路由定义
│ ├─api.php 路由定义
│ └─... 更多路由定义
多应用模式,路由定义文件需要放入应用目录下:
├─app 应用目录
│ ├─app_name 应用目录
│ │ ├─common.php 函数文件
│ │ ├─controller 控制器目录
│ │ ├─model 模型目录
│ │ ├─view 视图目录
│ │ ├─config 配置目录
│ │ ├─route 路由目录
│ │ │ ├─route.php 路由定义
│ │ │ ├─api.php 路由定义
│ │ │ └─... 更多路由定义
要使用Route类注册路由必须首先在路由定义文件开头添加引用(定义路由之后,原来的访问地址会自动失效)
use think\facade\Route;
Route::rule('路由表达式', '路由地址', '请求类型');
// 注册路由到News控制器的read操作
Route::rule('new/:id','News/read');
// 单独指定请求类型鹅快捷方法
Route::快捷方法名('路由表达式', '路由地址');
官方文档:https://www.kancloud.cn/manual/thinkphp6_0/1037499
Route::get('new/:id', 'News/read')
->ext('html')
->https();
路由参数可以混合使用,只要有任何一条参数检查不通过,当前路由就不会生效,继续检测后面的路由规则。
<?php
Route::get('chat/:user/:id','Index/chat');
public function chat($user, $id)
单个路由注册中间件:
Route::rule('hello/:name','hello')
->middleware(\app\middleware\Auth::class);
路由分组注册中间件:
Route::group('hello', function(){
Route::rule('hello/:name','hello');
})->middleware(\app\middleware\Auth::class);
使用数组方式,定义多个中间件:
Route::rule('hello/:name','hello')
->middleware([\app\middleware\Auth::class,\app\middleware\Check::class]);
ThinkPHP支持使用注解方式定义路由(也称为注解路由),如果需要使用注解路由需要安装额外的扩展:
composer require topthink/think-annotation
使用注解定义路由:
class Index
{
/**
* @param string $name 数据名称
* @return mixed
* @Route("hello/:name")
*/
public function hello($name)
{
return 'hello,'.$name;
}
}
把当前的URL绑定到控制器/操作,最多支持绑定到操作级别。
// 绑定当前的URL到 Blog控制器
Route::bind('blog');
// 绑定当前的URL到 Blog控制器的read操作
Route::bind('blog/read');
Request对象可通过 think\facade\Request;t或者request()助手函数两种方式获取;
判断参数是否传递,等同于isset(request()->get("id"));
Request::get('name','default'); // 返回值为default
框架默认没有设置任何全局过滤规则,你可以在app\Request对象中设置filter全局过滤属性;
全局变量过滤方法:Request::filter(['strip_tags','htmlspecialchars']),
获取变量的时候过滤:Request::param('username','','strip_tags,strtolower'); // 获取param变量 并依次调用strip_tags、strtolower函数过滤
对于body中提交的json对象,你无需使用php://input去获取,可以直接当做表单提交的数据使用,因为系统已经自动处理过了;
/* 设置默认值 */
Request::only(['id'=>0,'name'=>'']);
/* 只获取当前请求的id和name变量*/
Request::only(['id','name']);
/* 只获取GET请求的id和name变量*/
Request::only(['id','name'], 'get');
/* 排除id和name变量*/
Request::except(['id','name']);
Request::变量类型('变量名/修饰符');
为了简化使用,还可以使用系统提供的input助手函数完成上述大部分功能。https://www.kancloud.cn/manual/thinkphp6_0/1037519#_89
/*
* 按照格式化字符获取当前时间
* */
function now($format="Y-m-d H:i:s"){
return date($format,time());
}
QdAccount::order('belong', 'desc')
->paginate([
'list_rows' => $json['size'],
'page' => $json['page'],
])->toArray();
//最终输出
{
"total": 2,
"per_page": 30,
"current_page": 1,
"last_page": 1,
"data": [
{
"id": 1,
"mobile": "18273411374",
"password": "123",
"register_time": "2022-07-14 13:31:04"
},
{
"id": 2,
"mobile": "18273411374",
"password": "123",
"register_time": "2022-07-14 13:32:04"
}
]
}
Tp6.0报错Driver [Think] not supported.是因为没有安装tp视图库,安装即可。
composer require topthink/think-view
文件上传:https://www.kancloud.cn/manual/thinkphp6_0/1037639,文件系统类:https://github.com/ctfang/think-flysystem
在Linux系统上,Thinkphp是区分大小写的。模型名、控制器等必须大小写一致。
Session保存的目录不可写时,将导致session失效。
通过助手函数直接让用户响应下载文件:https://kancloud.cn/manual/thinkphp6_0/1037529
控制器进行响应时,可以携带一个状态码。
Thinkphp通过伪静态重定向,会导致正常访问不存在的资源时也会经过PHP处理。
更新6.1移除了filesystem的库,导致文件上传报错了。安装的时候又报错了。
require ext-fileinfo * -> it is missing from your system. Install or enable PHP's fileinfo extension.
出现此错误的原因是php.ini中的fileinfo扩展没有开启,安装fileinfo拓展,开启 extension=fileinfo
更新6.1移除了filesystem的库,导致文件上传报错了。好不容易安装了,6.1版本用不了。
最后升级thinkphp到6.1.x-dev版本才解决。
ORM:https://www.kancloud.cn/manual/think-orm/1258072
// 开启字段缓存
'fields_cache' => true,
// 字段缓存路径
'schema_cache_path' => 'path/to/cache',
开启后,会自动生成使用过的数据表字段缓存,如果你更改了数据表的字段及类型,需要清空字段缓存文件。字段缓存采用文件方式保存,路径由schema_cache_path配置参数设置。