文章目录
一、API友好
官方文档:https://www.kancloud.cn/manual/thinkphp5/118017
API (Application Programming Interface):简单来说就是应用程序编程接口
。
我对API友好的理解:指原本一些复杂的操作方法函数,在thinkphp5里面被包装成类库,咱们可以更加方便的使用类库去实现我们想要实现的操作效果。
下面引入一位大神对于API的理解 ,我感觉他讲解的挺好的。
作为一个编程初学者来说,API函数也许是一个时常耳闻却感觉有些神秘的东西。单看它的复杂语法,就足令人望而生畏,但是任何事物在我们深入了解它之前,总是会有这种感觉的。我们这篇API入门教程的目的,就是要把API函数的来龙去脉告诉大家,破除对API函数的畏惧,使它成为我们编程的好助手。
大家可能在许多书上看到过API的英文全称(Application Programming Interface),WIN32 API也就是MicrosoftWindows 32位平台的应用程序编程接口。对这个定义的理解,需要追溯到操作系统的发展历史上,当WINDOWS操作系统开始占据主导地位的时候,开发WINDOWS平台下的应用程序成为人们的需要。而在WINDOWS程序设计领域处于发展的初期,WINDOWS程序员所能使用的编程工具唯有API函数,这些函数是WINDOWS提供给应用程序与操作系统的接口,他们犹如“积木块”一样,可以搭建出各种界面丰富,功能灵活的应用程序。所以可以认为API函数是构筑整个WINDOWS框架的基石,在它的下面是WINDOWS的操作系统核心,而它的上面则是所有的华丽的WINDOWS应用程序。
但是,那时的WINDOWS程序开发还是比较复杂的工作,程序员必须熟记一大堆常用的API函数,而且还得对WINDOWS操作系统有深入的了解。然而随着软件技术的不断发展,在WINDOWS平台上出现了很多优秀的可视化编程环境,程序员可以采用“即见即所得”的编程方式来开发具有精美用户界面和功能强大的应用程序。
这些优秀可视化编程环境操作简单、界面友好(诸如VB、VC 、DELPHI等),在这些工具中提供了大量的类库和各种控件,它们替代了API的神秘功能,事实上这些类库和控件都是构架在WIN32 API函数基础之上的,是封装了的API函数的集合。它们把常用的API函数的组合在一起成为一个控件或类库,并赋予其方便的使用方法,所以极大的加速了WINDOWS应用程序开发的过程。有了这些控件和类库,程序员便可以把主要精力放在程序整体功能的设计上,而不必过于关注技术细节。
实际上如果我们要开发出更灵活、更实用、更具效率的应用程序,必然要涉及到直接使用API函数,虽然类库和控件使应用程序的开发简单的多,但它们只提供WINDOWS的一般功能,对于比较复杂和特殊的功能来说,使用类库和控件是非常难以实现的,这时就需要采用API函数来实现。
这也是API函数使用的场合,所以我们对待API函数不必刻意来研究每一个函数的用法,那也是不现实的(能用的到的API函数有几千个呢)。正如某位大虾所说:API不要去学,在需要的时候去查API帮助就足够了。
1.举两个thinkphp5关于API友好的例子
(1)数据输出
<?php
namespace app\index\controller;
class Index
{
public function index() {
echo "十年磨一剑";
echo "<br/>";
echo "where: app/index/controller/Index.php/Index->index()";
echo "<br/>";
$data = ['name'=>'thinkphp','url'=>'thinkphp.cn'];
//config.php中设置--->'default_return_type'=>'json'
//即可返回json类型的数据
return ['data'=>$data,'code'=>1,'message'=>'操作完成1'];
// 支持指定json数据输出
return json(['data'=>$data,'code'=>1,'message'=>'操作完成2']);
// 支持指定xml数据输出
return xml(['data'=>$data,'code'=>1,'message'=>'操作完成3']);
//核心支持的数据类型包括view、xml、json和jsonp,其他类型的需要自己扩展。
}
}
- 运行结果:
(2)错误调试Trace
由于API开发不方便在客户端进行开发调试,但ThinkPHP5的Trace调试
功能支持Socket在内的方式,可以实现远程的开发调试
。
设置方式:
//config.php
'app_trace' => true,
'trace' => [
'type' => 'socket',
// socket服务器
'host' => 'slog.thinkphp.cn',
],
然后安装chrome浏览器插件后即可进行远程调试,详细参考调试部分。
二、获取请求信息(Request)
如果要获取当前的请求信息,可以使用
\think\Request
类
$request = Request::instance();
//创建一个请求对象调用Request类库
方法来实现相关功能$request = request();
//还可以使用助手函数- 官方文档:https://www.kancloud.cn/manual/thinkphp5/158834
1.获取URL信息
<?php
namespace app\index\controller;
use think\Request;
class Index {
public function index() {
$request = Request::instance();
// 获取当前域名
echo '当前域名: ' . $request->domain() . '<br/>';
// 获取当前入口文件
echo '当前入口文件: ' . $request->baseFile() . '<br/>';
// 获取当前URL地址 不含域名
echo '当前URL地址 不含域名: ' . $request->url() . '<br/>';
// 获取包含域名的完整URL地址
echo '获取包含域名的完整URL地址: ' . $request->url(true) . '<br/>';
// 获取当前URL地址 不含QUERY_STRING
echo '获取当前URL地址 不含QUERY_STRING: ' . $request->baseUrl() . '<br/>';
// 获取URL访问的ROOT地址
echo '获取URL访问的ROOT地址:' . $request->root() . '<br/>';
// 获取URL访问的ROOT地址
echo '获取URL访问的ROOT地址: ' . $request->root(true) . '<br/>';
// 获取URL地址中的PATH_INFO信息
echo '获取URL地址中的PATH_INFO信息: ' . $request->pathinfo() . '<br/>';
// 获取URL地址中的PATH_INFO信息 不含后缀
echo '获取URL地址中的PATH_INFO信息 不含后缀: ' . $request->path() . '<br/>';
// 获取URL地址中的后缀信息
echo '获取URL地址中的后缀信息: ' . $request->ext() . '<br/>';
}
}
2.获取 模块/控制器/操作名称
<?php
namespace app\index\controller;
use think\Request;
class Index {
public function index() {
$request = Request::instance();
echo "当前模块名称是 ". $request->module();
echo "<br/>当前控制器名称是 " . $request->controller();
echo "<br/>当前操作名称是" . $request->action();"<br/>";
}
}
3.获取请求参数(params)
<?php
namespace app\index\controller;
use think\Request;
class Index {
public function index() {
$request = Request::instance();
echo '请求方法:' . $request->method() . '<br/>';
echo '资源类型:' . $request->type() . '<br/>';
echo '访问ip地址:' . $request->ip() . '<br/>';
echo '是否AJax请求:' . var_export($request->isAjax(), true) . '<br/>';
echo '请求参数:';
dump($request->param());
echo '请求参数:仅包含name';
dump($request->only(['name']));
echo '请求参数:排除name';
dump($request->except(['name']));
}
}
4.获取路由和调度信息
<?php
namespace app\index\controller;
use think\Request;
class Index {
public function index() {
$request = Request::instance();
echo '路由信息:';
dump($request->route());
echo '调度信息:';
dump($request->dispatch());
}
}
三、判断请求类型(GET/POST/PUT…)
在很多情况下面,我们需要判断当前操作的请求类型是GET、POST、PUT、DELETE或者HEAD,一方面可以针对请求类型作出不同的逻辑处理,另外一方面有些情况下面需要验证安全性
,过滤不安全的请求。
ThinkPHP5.0 取消了用于判断请求类型的系统常量(如IS_GET,IS_POST等),统一采用 think\Request类
处理请求类型。
用法如下:
<?php
namespace app\index\controller;
use think\Request;
class Index {
public function index() {
$request = Request::instance();
// 是否为 GET 请求
if ($request->isGet()) echo "当前为 GET 请求";
// 是否为 POST 请求
if ($request->isPost()) echo "当前为 POST 请求";
// 是否为 PUT 请求
if ($request->isPut()) echo "当前为 PUT 请求";
// 是否为 DELETE 请求
if ($request->isDelete()) echo "当前为 DELETE 请求";
// 是否为 Ajax 请求
if ($request->isAjax()) echo "当前为 Ajax 请求";
// 是否为 Pjax 请求
if ($request->isPjax()) echo "当前为 Pjax 请求";
// 是否为手机访问
if ($request->isMobile()) echo "当前为手机访问";
// 是否为 HEAD 请求
if ($request->isHead()) echo "当前为 HEAD 请求";
// 是否为 Patch 请求
if ($request->isPatch()) echo "当前为 PATCH 请求";
// 是否为 OPTIONS 请求
if ($request->isOptions()) echo "当前为 OPTIONS 请求";
// 是否为 cli
if ($request->isCli()) echo "当前为 cli";
// 是否为 cgi
if ($request->isCgi()) echo "当前为 cgi";
}
}
四、验证参数数据
<?php
namespace app\index\controller;
use \think\Validate;
class Index {
public function index() {
$rule = [//验证规则
'name' => 'require|max:25',
'age' => 'number|between:1,120',
'email' => 'email',
];
$msg = [//返回的错误信息
'name.require' => '名称必须',
'name.max' => '名称最多不能超过25个字符',
'age.number' => '年龄必须是数字',
'age.between' => '年龄只能在1-120之间',
'email' => '邮箱格式错误',
];
$data = input('post.');//http请求方式post
$validate = new Validate($rule);//实例化一个验证类对象
$result = $validate->batch()->check($data);//batch()批量验证
if (!$validate->check($data)) {//检查post方式传进的数据是否符合规则
dump($validate->getError());//返回错误信息$msg
}
}
}
五、连接数据库
database.php
/* 数据库设置 */
'database' => [
// 数据库类型
'type' => 'mysql',
// 服务器地址
'hostname' => '127.0.0.1',
// 数据库名
'database' => 'thinkphp',
// 数据库用户名
'username' => 'root',
// 数据库密码
'password' => '',//自己设置的密码
// 数据库连接端口
'hostport' => '',
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => 'utf8',
// 数据库表前缀
'prefix' => '',
// 数据库调试模式
'debug' => false,
],
六、原生SQL语句查询
<?php
namespace app\index\controller;
use think\Db;//引用Db类库
class Index
{
public function index()
{
$res = Db::query('select version()');
dump($res);
}
}