ThinkPHP5.1構建Restful風格API

下載安裝composer

composer使用國內鏡像

composer config -g repo.packagist composer https://packagist.phpcomposer.com

通過composer安裝ThinkPHP5.1

composer create-project topthink/think 項目名稱

通過composer安裝jwt

composer require firebase/php-jwt

ThinkPHP5.1配置

// config/app.php
<?php
return [
    // 開啟調試
    'app_debug'              => true,
    // 禁止訪問模塊
    'deny_module_list'       => [],   
];
// config/log.php

<?php
return [
    'type'        => 'File',
    'path'        => '../logs/',
    'level'       => [],
    'single'      => false,
    'apart_level' => [],
    'max_files'   => 0,
    'close'       => false,
    'json'        => true,
];
// application/common.php
// 此文件的意義,個人理解是定義全局變量和全局函數的

<?php
const ERRNO_MAP = [
    'OK'         => '成功',
    'DBERR'      => '數據庫查詢錯誤',
    'NODATA'     => '無數據',
    'DATAEXIST'  => '數據已存在',
    'DATAERR'    => '數據錯誤',
    'SESSIONERR' => '用戶未登錄',
    'LOGINERR'   => '用戶登錄失敗',
    'PARAMERR'   => '參數錯誤',
    'USERERR'    => '用戶不存在或未激活',
    'ROLEERR'    => '用戶身份錯誤',
    'PWDERR'     => '密碼錯誤',
    'REQERR'     => '非法請求或請求次數受限',
    'IPERR'      => 'IP受限',
    'THIRDERR'   => '第三方系統(tǒng)錯誤',
    'IOERR'      => '文件讀寫錯誤',
    'SERVERERR'  => '內部錯誤',
    'UNKOWNERR'  => '未知錯誤',
];
const ERRNO = [
    'OK'         => '0',
    'DBERR'      => '4001',
    'NODATA'     => '4002',
    'DATAEXIST'  => '4003',
    'DATAERR'    => '4004',
    'SESSIONERR' => '4101',
    'LOGINERR'   => '4102',
    'PARAMERR'   => '4103',
    'USERERR'    => '4104',
    'ROLEERR'    => '4105',
    'PWDERR'     => '4106',
    'REQERR'     => '4201',
    'IPERR'      => '4202',
    'THIRDERR'   => '4301',
    'IOERR'      => '4302',
    'SERVERERR'  => '4500',
    'UNKOWNERR'  => '4501',
];

// 向前端返回JSON數據
function ajaxReturn() {
    // 形參個數
    $args_num = func_num_args();
    // 形參列表
    $args = func_get_args();
    if (1 === $args_num) {
        return \json([
            'errno' => ERRNO['OK'],
            'msg'   => '成功',
            'data'  => $args[0]]);
    }
    if (2 === $args_num) {
        return \json([
            'errno' => $args[0],
            'msg'   => $args[1]]);
    }
    if (3 === $args_num) {
        return \json([
            'errno' => $args[0],
            'msg'   => $args[1],
            'data'  => $args[2]]);
    }
    throw new Exception("Error The number of parameters can be one or two or three");
}

use \Firebase\JWT\JWT;
// 設置JWT
function setJWT($data) {
    $jwt   = new JWT();
    $token = array(
        // "iss"  => "http://example.org", // 簽發(fā)者
        // "aud"  => "http://example.com", // 認證者
        'iat'  => time(), // 簽發(fā)時間
        'nbf'  => time(), // 生效時間
        'exp'  => (time() + 60 * 60 * 24 * 7), // 過期時間  7天后的時間戳
        'data' => $data,
    );
    $jwt = $jwt::encode($token, \config('jwt_key'), 'HS256');
    return $jwt;
}
// 獲取JWT內容
function getJWT($token) {
    $jwt  = new JWT();
    $data = null;
    try {
        $jwt_data = $jwt::decode($token, \config('jwt_key'), array('HS256'));
        $data     = (array) ($jwt_data->data);
    } catch (\Throwable $e) {
        Log::write($e->getMessage(), 'error');
        return null;
    }
    return $data;
}
// application/common/controller/Common.php

<?php
namespace app\common\controller;
class Common {
    public function miss() {
        return \json([
            'errno' => \ERRNO['PARAMERR'],
            'msg'   => '訪問接口不存在或參數錯誤']);
    }
}

// application/common/controller/Authen.php

<?php
namespace app\common\controller;

use app\common\controller\Common;

class Authen extends Common {
    // 用戶信息
    protected $user_info;
    public function initialize() {
        $token = \input('server.http_token');
        // 驗證是否登錄
        if (is_null($token)) {
            header('Content-Type:application/json; charset=utf-8');
            exit(json_encode([
                'code'  => ERRNO['SESSIONERR'],
                'error' => '用戶未登陸']));
        }
        // 驗證登錄是否過期
        $user_info = \getJWT($token);
        if (is_null($user_info)) {
            header('Content-Type:application/json; charset=utf-8');
            exit(json_encode([
                'code'  => ERRNO['SESSIONERR'],
                'error' => '登錄已過期']));
        }
        // 存儲用戶信息
        $this->user_info = $user_info;
    }
}
// application/test[應用名稱]/config/database.php

<?php
return [
    'type'            => 'mysql',
    'hostname'        => '127.0.0.1',
    'database'        => 'test',
    'username'        => 'root',
    'password'        => 'root',
    'hostport'        => '3306',
];
// application/test[應用名稱]/controller/v1/Teacher.php

<?php
namespace app\test\controller\v1;
// 不需要認證的話繼承Common
use app\common\controller\Common;

// 需要登錄驗證的繼承Authen
// use app\common\controller\Authen;
use Log;

class Teacher extends Common {
    // 查 getTest
    // 增 postTest
    // 改 putTest
    // 刪 deleteTest
    public function getStudents() {
        return \ajaxReturn(ERRNO['OK'],'查詢成功',['list'=>[]]);
    }
}
// route/route.php

<?php
// 定義miss路由
Route::miss('common/Common/miss');
// route/test[應用名稱].php

<?php
Route::group('test/v1.0', function () {
    Route::group('teacher', function () {
        // /test/v1.0/teacher/students
        Route::get('students', 'getStudents');
    })->prefix('test/v1.teacher/');
})
    ->ext(false)
    ->header('Access-Control-Allow-Headers', 'token')
    ->allowCrossDomain()
    ->pattern(['id' => '\d+']);

部署到linux上的問題

// 刪除.user.ini文件
chattr -i ~/public/.user.ini
rm -f ~/public/.user.ini

// 改變目錄權限
chmod -R 777 ~
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末树碱,一起剝皮案震驚了整個濱河市肯适,隨后出現的幾起案子,更是在濱河造成了極大的恐慌成榜,老刑警劉巖框舔,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異赎婚,居然都是意外死亡刘绣,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門挣输,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纬凤,“玉大人,你說我怎么就攤上這事撩嚼⊥J浚” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵绢馍,是天一觀的道長向瓷。 經常有香客問我,道長舰涌,這世上最難降的妖魔是什么猖任? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮瓷耙,結果婚禮上朱躺,老公的妹妹穿的比我還像新娘。我一直安慰自己搁痛,他們只是感情好长搀,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鸡典,像睡著了一般源请。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天谁尸,我揣著相機與錄音舅踪,去河邊找鬼。 笑死良蛮,一個胖子當著我的面吹牛抽碌,可吹牛的內容都是我干的。 我是一名探鬼主播决瞳,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼货徙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了皮胡?” 一聲冷哼從身側響起痴颊,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胸囱,沒想到半個月后祷舀,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡烹笔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了抛丽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谤职。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖亿鲜,靈堂內的尸體忽然破棺而出允蜈,到底是詐尸還是另有隱情,我是刑警寧澤蒿柳,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布饶套,位于F島的核電站,受9級特大地震影響垒探,放射性物質發(fā)生泄漏妓蛮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一圾叼、第九天 我趴在偏房一處隱蔽的房頂上張望蛤克。 院中可真熱鬧,春花似錦夷蚊、人聲如沸构挤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽筋现。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間矾飞,已是汗流浹背一膨。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留凰慈,地道東北人汞幢。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像微谓,于是被迫代替她去往敵國和親森篷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內容