1-5写了框架的基本实现方法,对一个小中型的app接口的实现是没有问题,最后总结一下这个框架的一些扩展的东西,而且对自己写接口的一些理解。
1,首先研究了一下公共函数,也就是整个项目大部分地方都能用到的函数,所以就用公共函数,方便调用。
在application下边的common.php下边定义自己的函数,例如在common.php里边写了日志的函数和格式化当前时间的方法,方便调用:
define ("DATE_IP","时间-ip"); define ("API_NAME","接口名称"); define ("PARAMS","接口参数"); define ("API_ERROR","请求错误信息"); define ("REQUEST_METHOD","请求方式"); use think\request; // 应用公共文件 function LogByApi() { //Log::write('测试日志信息,这是警告级别,并且实时写入',DATE_IP); //Log::write('测试日志信息,这是警告级别,并且实时写入',API_NAME); //Log::write('测试日志信息,这是警告级别,并且实时写入',PARAMS); \think\Log::info([DATE_IP => "192.168.102.4",API_NAME => "用户登录接口测试"]); echo 'this is Log'; } function DateByFormatWithString($formatString) { return date($formatString,time()); }
这是扩展方法,可以在任何地方不用引用而去调用。
2,扩展类,在extend文件夹中创建不同的类,命名空间之后,就可以初始化类的方法和属性,然后全局进行调用。
3,日志的使用:
首先日志在每一次运行app和调用到不同url的时候,都会自动写入一次日志,日志的记录可以看见当前用户请求了多少次URL,以及各种请求参数,错误等都写在日志文件里边,方便后期错误的排查等。
日志的配置在config.php里边,至此ThinkPHPV5.0.3教程结束,感谢ThinkPHP。
PS:用户手册
'log' => [ // 日志记录方式,内置 file socket 支持扩展 'type' => 'File', // 日志保存目录 'path' => LOG_PATH, // 日志记录级别 'level' => [], ],
type是写入日志的驱动文件,也就是File文件,路径在thinkphp/library/think/log/driver/File.php中。
如果要停止日志的写入,那么:
'log' => [ // 可以临时关闭日志写入 'type' => 'test',//type改为test,也就是走test文件 ],
path为当前日志保存的路径,默认为LOG_PATH->app/runtime/log下边。
level为日志的级别,这个级别也可以说是分类,自己也可以设置自定义的,级别分别有:ThinkPHP对系统的日志按照级别来分类,并且这个日志级别完全可以自己定义,系统内部使用的级别包括:log 常规日志,用于记录日志error 错误,一般会导致程序的终止notice 警告,程序可以运行但是还不够完美的错误info 信息,程序输出信息debug 调试,用于调试信息sql SQL语句,用于SQL记录,只在数据库的调试模式开启时有效这是全局设置,如果要在控制器或者别的地方设置 ,则:
在使用日志记录之前,首先需要初始化日志类,指定当前使用的日志记录方式。 Log::init([ 'type' => 'File', 'path' => APP_PATH.'logs/' ]);
日志的清空:Log::clear();
日志授权,也就是该记录日志的条件:
5.0的日志功能支持写入授权,我们可以设置某个请求的日志授权Key,然后设置允许授权写入的配置Key, 实现个别用户日志记录的功能,从而提高高负载下面的日志记录性能。 首先需要在应用配置文件或者应用公共文件中添加当前访问的授权Key定义,例如: // 设置IP为授权Key Log::key(Request::instance()->ip()); 然后在日志配置参数中增加allow_key参数,如下: 'log' => [ // 日志类型为File 'type' => 'File', // 授权只有202.12.36.89 才能记录日志 'allow_key' => ['202.12.36.89'], ] 5.0的日志功能支持写入授权,我们可以设置某个请求的日志授权Key,然后设置允许授权写入的配置Key, 实现个别用户日志记录的功能,从而提高高负载下面的日志记录性能。 首先需要在应用配置文件或者应用公共文件中添加当前访问的授权Key定义,例如: // 设置IP为授权Key Log::key(Request::instance()->ip()); 然后在日志配置参数中增加allow_key参数,如下: 'log' => [ // 日志类型为File 'type' => 'File', // 授权只有202.12.36.89 才能记录日志 'allow_key' => ['202.12.36.89'], ]
日志是基于use think\Log;引用这个类之后,可以调用其中的方法:
方法 描述 Log::record() 记录日志信息到内存 Log::save() 把保存在内存中的日志信息(用指定的记录方式)写入 Log::write() 实时写入一条日志信息 // Log::error(); //Log::write('测试日志信息,这是警告级别,并且实时写入',DATE_IP); //Log::write('测试日志信息,这是警告级别,并且实时写入',API_NAME); //Log::write('测试日志信息,这是警告级别,并且实时写入',PARAMS); \think\Log::info([DATE_IP => "192.168.102.4",API_NAME => "用户登录接口测试"]);
可以直接引用完之后用类Log调用,也可以不引用,直接\think\Log去调用静态方法。
一个完整的日志格式:
--------------------------------------------------------------- [ 2016-12-10T12:30:42+08:00 ] ::1 ::1 GET /app/public/admin/index/getAll [ log ] localhost/app/public/admin/index/getAll [运行时间:0.012196s][吞吐率:82.00req/s] [内存消耗:498.72kb] [文件加载:44] [ info ] [ LANG ] /Applications/XAMPP/xamppfiles/htdocs/app/thinkphp/lang/zh-cn.php [ info ] [ ROUTE ] array ( 'type' => 'module', 'module' => array ( 0 => 'admin', 1 => 'index', 2 => 'getAll', ), ) [ info ] [ HEADER ] array ( 'host' => 'localhost', 'user-agent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:41.0) Gecko/20100101 Firefox/41.0', 'accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'accept-language' => 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3', 'accept-encoding' => 'gzip, deflate', 'cookie' => '_ga=; DoNotShowFTU=true; lastMangerHost=http%3A//localhost%3A8087', 'connection' => 'keep-alive', 'cache-control' => 'max-age=0', ) [ info ] [ PARAM ] array ( ) [ info ] [ RUN ] app\admin\controller\Index->getAll[ /Applications/XAMPP/xamppfiles/htdocs/app/application/admin/controller/Index.php ] [ info ] array ( '时间-ip' => '192.168.102.4', '接口名称' => '用户登录接口测试', ) [ info ] [ DB ] INIT mysql [ info ] [ LOG ] INIT File [ log ] error [ sql ] [ DB ] CONNECT:[ UseTime:0.001605s ] mysql:dbname=db_wegoto;host=127.0.0.1;charset=utf8 [ sql ] [ SQL ] SHOW COLUMNS FROM `we_ad` [ RunTime:0.003666s ] [ sql ] [ SQL ] SELECT * FROM `we_ad` [ RunTime:0.000637s ] ---------------------------------------------------------------
对API自己的一些想法,写api就不用在当前模块创建视图,也就是view,api只要输出数据就行,要么是xml,要么就是json。
1,所以对于app可以自己新建一个模块,api模块,里边有controller,有model,但是没有view,model主要保存当前数据表的数据和处理查询当前数据表的操作,控制器主要处理一些数据上的逻辑问题,然后返回给客户端。
一个应用可以创建一个api关于接口的模块,模块里边可以有好几个控制器,例如用户的控制器处理用户登录注册的业务逻辑,商品处理查询商品列表,单个商品详情的业务逻辑等。然后可以创建一个新的模块,用来写当前项目的后台,例如admin模块。
2,json的返回有一个统一的格式,data是当前返回的数据实例,data里边的数据可能有不同,但是data键必须在,然后是message,statusCode或者responseCode。数据请求正确则以,如果请求错误,那么如果数据是数组,data则返回空数组,如果是字典,那么就返回空字典(其实也是数组),例如第五讲里边的格式。
3,日志是必须得一个操作,可以修改日志的路径为当前api的路径,不管当前请求接口错误与否,都在日志中添加一些数据,例如自己总结的数据。
define ("DATE_IP","时间-ip"); define ("API_NAME","接口名称"); define ("PARAMS","接口参数"); define ("API_ERROR","请求错误信息"); define ("REQUEST_METHOD","请求方式");
然后在每个接口里边判断当前接口出现错误的时候,应该写入错误内容。
4,将常用的方法,例如格式化时间,获取当前请求URL啊或者一些方法封装到公共方法工具中,直接调用。
至此ThinkPHPV5.0.3教程完毕,感谢ThinkPHP。
PS:用户手册 http://www.kancloud.cn/manual/thinkphp5
获取请求变量的手册:http://www.kancloud.cn/manual/thinkphp5/118044
实例:
common.php <?php // +---------------------------------------------------------------------- // | ThinkPHP [ WE CAN DO IT JUST THINK ] // +---------------------------------------------------------------------- // | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved. // +---------------------------------------------------------------------- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) // +---------------------------------------------------------------------- // | Author: 流年 <liu21st@gmail.com> // +---------------------------------------------------------------------- define ("DATE_IP","时间-ip"); define ("API_PATH","请求接口"); define ("PARAMS","接口参数"); define ("API_ERROR","请求错误信息"); define ("REQUEST_METHOD","请求方式"); use think\request; use think\Log; // 应用公共函数 /* * ==========日志============= */ //写入日志 function LogByApi() { //初始化request $request = Request::instance(); //获取当前请求的URL $currentApi = $request->url(true); //获取当前时间 $currentDate = dateByNow(); //获取当前IP $currentIP = $request->ip(); //获取当前请求方式 $requestMethod = $request->method(); //获取当前的请求参数 $requestParams = array('gets' => $request->get(),'post' => $request->post()); //写入 Log::info($currentDate.' - '.$currentIP,DATE_IP); Log::info($requestMethod,REQUEST_METHOD); Log::info($currentApi,API_PATH); Log::info($requestParams,PARAMS); } //写入错误日志 function LogByApiWithError($errorInfo) { //获取当前请求的URL $currentApi = Request::instance()->url(true); Log::error($currentApi.' - \''.$errorInfo.'\''); } /* * ==========date============= */ //根据格式化字符串格式化时间戳 function DateByFormatWithString($formatString) { return date($formatString,time()); } //获取当前格式化的时间 function dateByNow() { return date('Y-m-d H:i:s',time()); } /* * ==========API By json============= */ Basecontroller.php <?php namespace app\api\controller; //系统类库 use think\controller; use think\Db; use think\Log; //自定义model /** * 自定义基类 */ class Basecontroller extends Controller { public function _initialize() { //修改日志保存地址 Log::init([ 'type' => 'File', 'path' => APP_PATH.'/'.request()->module().'/logs/' ]); //写入日志,调用公共方法 LogByApi(); } } ?>