Slim Framework 快速開發 API 架構的 Server side 資源



雖說很早就知道這款輕量級快速開發的 Slim Framework ,但一直沒機會用到。

(這陣子寫Javascript跟幫別人Debug比較多…汗)

剛好這次銀行做活動要接個後台,就拿來用拉~

需求很簡單: 就是投票!

可以針對題目的選項做投票,也無需加上防灌票機制,前端 Javascript 做 AJAX 送出投票,後端用這套開發的API來接。

寫過 NodeJS 的 Express 專案的人應該知道,他的迷人處就是 route 設計機制,而這款也是如此,下面直接貼部分原始碼來介紹一下,一個好佈署與開發的框架可以在執行專案上減少不少時間,框架開發下又能夠兼顧品質,值得推薦~

<?php
require 'Slim/Slim.php';
/**
    ref: https://github.com/joshcam/PHP-MySQLi-Database-Class 
    滿不錯用的MySQL DB操作工具
**/
require_once ('lib/MysqliDb.php');
\Slim\Slim::registerAutoloader();

// 將陣列轉為JSON輸出方法包裝過
class MXPSlim extends Slim\Slim {
    function outputArray($data) {
        switch($this->request->headers->get('Accept')) {
            case 'application/json':
            default:
                $this->response->headers->set('Content-Type', 'application/json');
                $this->response->headers->set('X-Powered-By', 'Mxp.tw');
                $this->response->header('Access-Control-Allow-Origin', '*');
                $this->response->header('Access-Control-Allow-Methods: GET, POST');
                $this->response()->body(json_encode($data));      
        }       
    } 
}
// 建立Slim應用
$app = new MXPSlim();
// 關閉輸出錯誤提示
$app->config('debug', false);
// 指定樣版目錄
$app->config(array(
    'templates.path' => './',
));

$db = new MysqliDb ('localhost', 'USERNAME', 'PASSWORD', 'DBNAME');

// GET route 首頁不顯示內容
$app->get(
    '/',
    function () {
    echo '';
    }
);
/**
    設定的請求網址也可以很有彈性,透過URL來分功能與當參數傳遞,
    無論GET方法或POST方法都是很好的組合,RESTful的規格在這就可以被簡單實現
    (其他HTTP method本次案例沒用上)。
**/
$app->get(
    '/get(/:qid(/:aid))',
    function ($qid="tw",$aid="mxp") use ($app) {
        $db = MysqliDb::getInstance();

        if (is_numeric($qid) && is_numeric($aid)){
            /**
                取得題目投票資料,用在顯示結果
            **/
            $app->outputArray(array("status"=>"OK","data"=>$voting));
        } else if ($qid=="mxp" && $aid=="tw") {
            /**
                取得全部問題與題目投票資料,用在顯示結果
            **/
            $app->outputArray(array("status"=>"OK","data"=>$voting));
        } else {
            $app->outputArray(array("status"=>"ERROR"));
        }
    }
);
// POST route 投票功能
$app->post(
    '/set(/:qid(/:aid))',
    function ($qid="tw",$aid="mxp")  use ($app) {
        $vote = $app->request->post('vote');
        $db = MysqliDb::getInstance();

        if (is_numeric($qid) && is_numeric($aid) && isset($vote)) {
            /**
                撈取題目下的選項,更新投票數
            **/
            $app->outputArray(array("status"=>"OK","data"=>$voting));
        } else {
            $app->outputArray(array("status"=>"ERROR"));
        }
    }
);
//將錯誤頁包裝過
$app->error(function (\Exception $e) use ($app) {
    $app->response()->status(200);
    echo "";
});
//將錯誤頁包裝過
$app->notFound(function () use ($app) {
    $app->response()->status(200);
    echo "";
});
//執行投票App
$app->run();
Share: