NO IMAGE

概述

Lumen是一個基於Laravel的微框架,主要用於小型應用和微服務,專注於效能和速度的優化,該框架一個重要的應用就是構建 REST API。

lumen-api

為什麼用Lumen構建REST API

  • Lumen訪問速度非常快
  • 每秒能夠處理的請求數比Laravel更多
  • 使用nikic/FastRoute取代Symphony,從而提升了效能

安裝 & 配置

關於Lumen詳細安裝教程參考官方文件:http://laravelacademy.org/post/6328.html

這裡我們使用Composer在web根目錄下安裝:

composer create-project laravel/lumen rest_api

安裝完成後,在.env中配置資料庫連線資訊:

DB_DATABASE=<db_name>
DB_USERNAME=<db_username>
DB_PASSWORD=<db_password>

然後在bootstrap/app.php中取消下面兩行之前的註釋:

$app->withFacades();
$app->withEloquent();

此時在瀏覽器訪問rest_api.dev(Mac下使用Valet,Windows請自行設定虛擬域名),頁面顯示如下:

Lumen (5.3.2) (Laravel Components 5.3.*)

資料庫遷移

接下來我們來建立資料表。

在專案根目錄下執行如下命令:

php artisan make:migration create_table_cars --create=cars

該命令將會在 database/migrations/目錄下建立一個遷移檔案<date>_create_table_cars.php,接下來我們來編輯這個檔案來定義資料表。

Schema::create('cars', function (Blueprint $table) {
    $table->increments('id');
    $table->string('make');
    $table->string('model');
    $table->string('year');
});

現在我們來執行這個遷移:

php artisan migrate

這樣,就會在資料庫中建立對應的表:

rest_api_cars

建立模型

接下來我們在app目錄下建立模型檔案Car.php,並編寫程式碼如下:

<?php namespace App;
use Illuminate\Database\Eloquent\Model;
class Car extends Model
{
     protected $fillable = ['make', 'model', 'year'];
     public $timestamps = false;
}

建立控制器

然後建立控制器檔案app/Http/Controllers/CarController.php

<?php
namespace App\Http\Controllers;
use App\Car;
use Illuminate\Http\Request;
class CarController extends Controller
{
public function createCar(Request $request)
{
$car = Car::create($request->all());
return response()->json($car);
}
public function updateCar(Request $request, $id)
{
$car = Car::find($id);
$car->make = $request->input('make');
$car->model = $request->input('model');
$car->year = $request->input('year');
$car->save();
return response()->json($car);
}
public function deleteCar($id)
{
$car = Car::find($id);
$car->delete();
return response()->json('刪除成功');
}
public function index()
{
$cars = Car::all();
return response()->json($cars);
}
}

定義路由

剩下的就是配置路由了,我將會為增刪改查配置對應路由。開啟app/Http/routes.php並新增如下路由:

$app->group(['prefix' => 'api/v1'], function($app)
{
    $app->post('car','[email protected]');
    $app->put('car/{id}','[email protected]');
    $app->delete('car/{id}','[email protected]');
    $app->get('car','[email protected]');
});

注意我將這組路由放到了api/v1字首下。

測試API

現在讓我們用curl來測試這組REST API。

首先我們來測試建立:

curl -i -X POST -H "Content-Type:application/json" http://rest_api.dev/api/v1/car -d '{"make":"audi","model":"tt","year":"2016"}'

輸出如下則表示建立成功:

HTTP/1.0 200 OK
Host: rest_api.dev
Connection: close
X-Powered-By: PHP/7.0.6
Cache-Control: no-cache
Content-Type: application/json
Date: Sun, 13 Nov 2016 07:06:13 GMT
{"make":"audi","model":"tt","year":"2016","id":1}

然後我們來測試更新剛剛建立的這條記錄:

curl -H "Content-Type:application/json" http://rest_api.dev/api/v1/car/1 -X PUT -d '{"make":"bmw","model":"x6","year":"2016"}'

輸出如下,表示更新成功:

{"id":1,"make":"bmw","model":"x6","year":"2016"}

接下來我們來測試列表頁面:

curl -H "Content-Type:application/json" http://rest_api.dev/api/v1/car -X GET

輸出如下:

[{"id":1,"make":"bmw","model":"x6","year":"2016"}]

最後,我們測試下刪除API:

curl -X DELETE http://rest_api.dev/api/v1/car/1