文章目录[隐藏]
最近在做一个需要大力出奇迹、快速开发的东西,听说 ThinkPHP 十分易于上手,就决定试一试用 ThinkPHP5.1 稳定版做程序的后端。因为过去基本没有用过 PHP 语言和 ThinkPHP 框架,所以基本是一边看手册一般写代码的。使用体验很好,ThinkPHP 不愧是风靡无数培训班的 PHP 框架,上手和使用都可以说是零门槛。
以下是我写代码时记录下的一些笔记。
路由注册
完整官方文档:https://www.kancloud.cn/manual/thinkphp5_1/353962
简化方法
通常我们更愿意使用对应请求类型的快捷方法,包括:
类型 | 描述 | 快捷方法 |
---|---|---|
GET | GET 请求 | get |
POST | POST 请求 | post |
PUT | PUT 请求 | put |
DELETE | DELETE 请求 | delete |
PATCH | PATCH 请求 | patch |
* | 任何请求类型 | any |
快捷注册方法的用法为:
Route:: 快捷方法名 ('路由表达式','路由地址');
使用示例如下:
Route::get('new/:id','News/read'); // 定义 GET 请求路由规则
Route::post('new/:id','News/update'); // 定义 POST 请求路由规则
Route::put('new/:id','News/update'); // 定义 PUT 请求路由规则
Route::delete('new/:id','News/delete'); // 定义 DELETE 请求路由规则
Route::any('new/:id','News/read'); // 所有请求都支持的路由规则
注册多个路由规则后,系统会依次遍历注册过的满足请求类型的路由规则,一旦匹配到正确的路由规则后则开始执行最终的调度方法,后续规则就不再检测。
资源路由
支持设置 RESTFul
请求的资源路由,方式如下:
Route::resource('blog','index/blog');
表示注册了一个名称为 blog
的资源路由到 index
模块的 Blog
控制器,系统会自动注册 7 个路由规则,如下:
标识 | 请求类型 | 生成路由规则 | 对应操作方法(默认) |
---|---|---|---|
index | GET | blog |
index |
create | GET | blog/create |
create |
save | POST | blog |
save |
read | GET | blog/:id |
read |
edit | GET | blog/:id/edit |
edit |
update | PUT | blog/:id |
update |
delete | DELETE | blog/:id |
delete |
模型
完整官方文档:https://www.kancloud.cn/manual/thinkphp5_1/354042
增加一条数据
第一种是实例化模型对象后赋值并保存:
$user = new User;
$user->name = 'thinkphp';
$user->email = 'thinkphp@qq.com';
$user->save();
save
方法返回影响的记录数,并且只有当before_insert
事件返回false
的时候返回false
,从V5.1.6+
版本开始统一返回布尔值
也可以直接传入数据到 save
方法批量赋值:
$user = new User;
$user->save([
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com'
]);
或者直接在实例化的时候传入数据
$user = new User([
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com'
]);
$user->save();
实例化传入的模型数据也不会经过修改器处理。
如果需要过滤非数据表字段的数据,可以使用:
$user = new User;
// 过滤 post 数组中的非数据表字段数据
$user->allowField(true)->save($_POST);
如果你通过外部提交赋值给模型,并且希望指定某些字段写入,可以使用:
$user = new User;
// post 数组中只有 name 和 email 字段会写入
$user->allowField(['name','email'])->save($_POST);
最佳的建议是模型数据赋值之前就进行数据过滤,例如:
$user = new User;
// 过滤 post 数组中的非数据表字段数据
$data = Request::only(['name','email']);
$user->save($data);
save
方法新增数据返回的是写入的记录数(通常是1
),而不是自增主键值。
增加多条数据
支持批量新增,可以使用:
$user = new User;
$list = [
['name'=>'thinkphp','email'=>'thinkphp@qq.com'],
['name'=>'onethink','email'=>'onethink@qq.com']
];
$user->saveAll($list);
saveAll 方法新增数据返回的是包含新增模型(带自增 ID)的数据集对象。
saveAll
方法新增数据默认会自动识别数据是需要新增还是更新操作,当数据中存在主键的时候会认为是更新操作,如果你需要带主键数据批量新增,可以使用下面的方式:
$user = new User;
$list = [
['id'=>1, 'name'=>'thinkphp', 'email'=>'thinkphp@qq.com'],
['id'=>2, 'name'=>'onethink', 'email'=>'onethink@qq.com'],
];
$user->saveAll($list, false);
不插入重复数据
先查询一下要插入的内容,看结果是否为空,如果结果为空代表没有重复数据,然后再插入。
$m= new Model;
$isExisted = (null !== Model::get($data));
if (!$isExisted) {
$m->allowField(true)->save($data);
}
如果要用 saveAll 方法的话,则可以先将二维数组的每一个子数组单独检测一下,将有查询结果的条目过滤掉,然后再用 saveAll 保存过滤后的数组。
中间件
完整官方文档:https://www.kancloud.cn/manual/thinkphp5_1/564279
注册中间件
最常用的中间件注册方式是注册路由中间件
Route::rule('hello/:name','hello')
->middleware('Auth');
或者使用完整的中间件类名
Route::rule('hello/:name','hello')
->middleware(app\http\middleware\Auth::class);
支持注册多个中间件
Route::rule('hello/:name','hello')
->middleware(['Auth', 'Check']);
全局中间件
你可以在应用目录下面定义 middleware.php
文件,使用下面的方式:
<?php
return [
\app\http\middleware\Auth::class,
'Check',
'Hello',
];
中间件的注册应该使用完整的类名,如果没有指定命名空间则使用 app\http\middleware
作为命名空间。
全局中间件的执行顺序就是定义顺序。可以在定义全局中间件的时候传入中间件参数,支持两种方式传入。
<?php
return [
[\app\http\middleware\Auth::class, 'admin'],
'Check',
'Hello:thinkphp',
];
上面的定义表示 给 Auth
中间件传入 admin
参数,给 Hello
中间件传入 thinkphp
参数。
CORS 中间件
摘录自官方文档的评论区:https://www.kancloud.cn/manual/thinkphp5_1/489844
<?php
// +------------------------------+
// | Author: cnguu <www@cnguu.cn> |
// +------------------------------+
// | 跨域控制
namespace app\http\middleware;
class CORS
{
public function handle($request, \Closure $next)
{
$response = $next($request);
$origin = $request->server('HTTP_ORIGIN') ?: '';
$allow_origin = [
'http://zz.cnguu.cn',
];
if (in_array($origin, $allow_origin)) {
$response->header('Access-Control-Allow-Origin', $origin);
$response->header('Access-Control-Allow-Headers', 'Authorization, Content-Type, Accept, Origin, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-Requested-With, X-Id, X-Token');
$response->header('Access-Control-Expose-Headers', 'Authorization, authenticated');
$response->header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, DELETE, OPTIONS');
$response->header('Access-Control-Allow-Credentials', 'true');
}
return $response;
}
}