版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/example440982/article/details/80328087
tp5框架开发RESTful风格接口例子
@time: 2018/5/15
@author: hotsuitor@qq.com
tp版本 5.1
缘由:公司需要一个生成海报的活动,本人是负责前端写前端页面的。本人思路是前端用canvas生成海报,公司的前辈给我的建议是用后端生成海报,前端canvas生成的图片会有一写手机不适配的问题。然后……后端说很简单,你自己写一下就好了,好吧,我自己写。
公司用的是tp3框架,我没有用过,之前有用过tp5,所以直接上最新的(已经更新到了tp5.1,版本会有点区别,不要怂,就是干)。
老规矩,先看官方文档(看《ThinkPHP5快速入门》,官网的《ThinkPHP5.0完全开发手册》不详细,收费与免费的区别),直接定位到 “API开发”, 根据官方文档的例子来写。
测试数据库
/*
Navicat MySQL Data Transfer
Source Server : localhost
Source Server Version : 50553
Source Host : localhost:3306
Source Database : test
Target Server Type : MYSQL
Target Server Version : 50553
File Encoding : 65001
Date: 2018-05-15 18:39:18
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for news
-- ----------------------------
DROP TABLE IF EXISTS `news`;
CREATE TABLE `news` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`content` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='新闻表';
-- ----------------------------
-- Records of news
-- ----------------------------
INSERT INTO `news` VALUES ('1', '新闻1', '新闻1内容');
INSERT INTO `news` VALUES ('2', '新闻2', '新闻2内容');
INSERT INTO `news` VALUES ('3', '新闻3', '新闻3内容');
INSERT INTO `news` VALUES ('4', '房价又涨了', '据新华社消息:上海均价环比上涨5%');
数据看相关的配置 在 数据库配置文件中配置 data
在 application 目录下新建 api 目录,用版本v1来区别,tp5.1的目录结构和tp5.0版本的目录结构略有区别,读者自行看官方文档。
├─application
│ ├─api
│ │ └─controller
│ │ └─v1
│ ├─common
│ └─model
├─config
├─extend
│ └─page
├─public
│ ├─static
│ │ ├─css
│ │ ├─font
│ │ ├─img
│ │ ├─js
│ │ ├─uploads
│ │ └─video
│ └─test
├─route
在v1目录下新建 News.php 控制器,注意看命名空间,就知道目录结构了
<?php
namespace app\api\controller\v1;
use think\Controller;
class News extends Controller
{
public function read()
{
$id = input('id');
$model = model('News');
$data = $model->getNews($id);// 查询数据
if ($data) {
$code = 200;
} else {
$code = 404;
}
$data = [
'code' => $code,
'data' => $data
];
return json($data);
}
}
在common目录下 新建 model 目录,在model目录下,新建一个 News.php 模型
|---common
| |---model
| |---News.php
这里是手写的目录结构,所以跟上面tree命令生成的目录结构显示不太一样
<?php
namespace app\common\model;
use think\Model;
use think\Db;
class News extends Model
{
//不能写get方法,框架内部定义了get方法,本人一开始就在这里写了get方法
//导致一直报 xxxx News::get() non static method in class xxx
public function getNews($id = 1)
{
$res = Db::name('news')->where('id', $id)->select();
// echo $this->getLastSql();
return $res;
}
public function getNewsList()
{
$res = Db::name('news')->select();
// echo url('picture');
return $res;
}
}
定义路由,在route目录下的 route.php 文件
Route::rule(':version/news/:id', 'api/:version.News/read'); //查询
在浏览器中访问 tt.xyz/?s=v1/news/1 可以看到下图结果。其中 tt.xyz 是我本地配置的host域名,入口配置了Apache重写规则,但是直接访问 tt.xyz/v1/news/1 有问题,所以改用兼容方式访问。
最后给大家看一下目录结构,以防有人找不到,文中没有谈到的目录,忽略即可。