ThinkPHP 5.1 笔记(一)

最近在做一个需要大力出奇迹、快速开发的东西,听说 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;
    }
}

 

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注