Laravel JSON API 伺服器建置指南

Laravel JSON API 伺服器建置指南

安裝與設定

首先,您需要安裝Laravel框架。使用Composer安裝Laravel:

composer create-project laravel/laravel api-project
cd api-project

建立資料庫結構

在建立API之前,需要設定資料庫連接。編輯.env檔案設定資料庫連接參數:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=your_database
DB_USERNAME=your_username
DB_PASSWORD=your_password

然後建立migration檔案來定義資料表結構:

php artisan make:migration create_products_table

在migration檔案中定義資料表結構:

public function up()
{
    Schema::create('products', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->text('description');
        $table->decimal('price', 8, 2);
        $table->timestamps();
    });
}

執行migration建立資料表:

php artisan migrate

建立模型

建立對應的Eloquent模型:

php artisan make:model Product

建立API控制器

建立一個API控制器來處理請求:

php artisan make:controller Api/ProductController --api

在控制器中實現CRUD操作:

<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Models\Product;
use Illuminate\Http\Request;

class ProductController extends Controller
{
    public function index()
    {
        $products = Product::all();
        return response()->json($products);
    }

    public function store(Request $request)
    {
        $validated = $request->validate([
            'name' => 'required|string|max:255',
            'description' => 'required|string',
            'price' => 'required|numeric'
        ]);

        $product = Product::create($validated);
        return response()->json($product, 201);
    }

    public function show(Product $product)
    {
        return response()->json($product);
    }

    public function update(Request $request, Product $product)
    {
        $validated = $request->validate([
            'name' => 'sometimes|string|max:255',
            'description' => 'sometimes|string',
            'price' => 'sometimes|numeric'
        ]);

        $product->update($validated);
        return response()->json($product);
    }

    public function destroy(Product $product)
    {
        $product->delete();
        return response()->json(null, 204);
    }
}

定義API路由

routes/api.php檔案中定義API路由:

<?php

use App\Http\Controllers\Api\ProductController;
use Illuminate\Support\Facades\Route;

Route::apiResource('products', ProductController::class);

這將自動生成以下路由:

  • GET /api/products - 獲取所有產品
  • POST /api/products - 創建新產品
  • GET /api/products/{product} - 獲取單個產品
  • PUT/PATCH /api/products/{product} - 更新產品
  • DELETE /api/products/{product} - 刪除產品

API認證

如需API認證,可以使用Laravel Sanctum:

composer require laravel/sanctum
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
php artisan migrate

app/Models/User.php中添加Sanctum特性:

use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;
    
    // ...
}

API授權

在控制器中添加授權檢查:

public function __construct()
{
    $this->middleware('auth:sanctum')->except(['index', 'show']);
}

API版本控制

在路由檔案中可以實現API版本控制:

Route::prefix('v1')->group(function () {
    Route::apiResource('products', ProductController::class);
});

API資源轉換

使用API資源轉換器格式化回應:

php artisan make:resource ProductResource

編輯資源類:

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class ProductResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'description' => $this->description,
            'price' => $this->price,
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at
        ];
    }
}

在控制器中使用資源:

public function index()
{
    $products = Product::all();
    return ProductResource::collection($products);
}

public function show(Product $product)
{
    return new ProductResource($product);
}

API文檔生成

可以使用L5-Swagger套件生成API文檔:

composer require darkaonline/l5-swagger
php artisan vendor:publish --provider "L5Swagger\L5SwaggerServiceProvider"

在控制器中添加Swagger註解:

/**
 * @OA\Get(
 *     path="/api/products",
 *     summary="獲取所有產品",
 *     @OA\Response(response=200, description="成功獲取產品列表")
 * )
 */
public function index()
{
    // ...
}

API測試

建立API測試:

php artisan make:test ProductApiTest

編寫測試案例:

<?php

namespace Tests\Feature;

use App\Models\Product;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class ProductApiTest extends TestCase
{
    use RefreshDatabase;

    public function test_can_get_all_products()
    {
        Product::factory()->count(3)->create();
        
        $response = $this->getJson('/api/products');
        
        $response->assertStatus(200)
            ->assertJsonCount(3);
    }
    
    // 更多測試...
}

常見Laravel API套件

以下是一些有用的Laravel API開發套件:

套件名稱 說明 連結
Laravel Sanctum 輕量級API認證系統 https://laravel.com/docs/sanctum
Laravel Passport 完整的OAuth2伺服器實現 https://laravel.com/docs/passport
Fractal API轉換層 https://github.com/spatie/laravel-fractal
L5-Swagger API文檔生成器 https://github.com/DarkaOnLine/L5-Swagger
Laravel CORS 跨域資源共享支援 https://github.com/fruitcake/laravel-cors

API最佳實踐

  1. 使用恰當的HTTP狀態碼
  2. 實施資料驗證
  3. 使用分頁來處理大型集合
  4. 實施速率限制以防止濫用
  5. 使用一致的命名約定
  6. 實施適當的錯誤處理
  7. 使用API資源進行資料轉換
  8. 實施快取以提高性能

以上步驟將幫助您使用Laravel建立一個功能完整、安全且高效的JSON API伺服器。

為您提供在Laravel中創建包含UI的資料結構,以建立JSON API認證伺服器的最簡單方法:

使用Laravel UI工具快速建立認證系統

使用Laravel UI套件是最簡單的方式:

composer require laravel/ui
php artisan ui bootstrap --auth
php artisan ui vue --auth
php artisan ui react --auth

這將生成完整的認證UI,包括登入、註冊和密碼重置頁面。

搭配Laravel Breeze實現輕量級解決方案

Laravel Breeze提供簡潔的認證系統和API支援:

composer require laravel/breeze --dev
php artisan breeze:install
php artisan breeze:install api

支援Blade, Vue或React前端,並具備API認證骨架。

使用Laravel Jetstream獲得更多功能

Laravel Jetstream提供更豐富的功能集:

composer require laravel/jetstream
php artisan jetstream:install livewire
# 或者
php artisan jetstream:install inertia

可加上--teams選項啟用團隊功能。

借助Admin面板工具迅速建立

以下工具可以幫助您快速建立資料結構和管理界面:

Laravel Filament

composer require filament/filament
php artisan filament:install

特點:

  • 快速建立資源CRUD操作
  • 資料表、表單自動生成
  • 強大的權限系統
  • 支援API生成
  • 現代化UI設計

Laravel Voyager

composer require tcg/voyager
php artisan voyager:install
php artisan voyager:admin your@email.com

特點:

  • 視覺化資料管理
  • 拖拽式介面建構器
  • 內建BREAD (Browse, Read, Edit, Add, Delete) 系統
  • 多媒體管理器
  • 用戶角色和權限

Laravel Nova

composer require laravel/nova
php artisan nova:install

特點:

  • 優雅的資源管理
  • 自定義字段和資源工具
  • 度量卡片和趨勢分析
  • 強大的篩選功能
  • 與Laravel生態系統完美整合

Laravel Backpack

composer require backpack/crud
php artisan backpack:install

特點:

  • 快速CRUD生成
  • 拖放式表單生成器
  • 高自定義性
  • 豐富的字段類型
  • 外觀主題可選

結合API工具完成JSON API建立

在建立UI和資料結構後,結合以下工具完成API部分:

# 使用Sanctum進行API認證
composer require laravel/sanctum
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
php artisan migrate

或者使用API資源進行資料轉換:

php artisan make:resource UserResource
php artisan make:resource ProductResource

最簡單的完整解決方案

如果想要一套完整的解決方案,推薦以下步驟:

  1. 使用Laravel Breeze安裝API骨架:
composer require laravel/breeze --dev
php artisan breeze:install api
php artisan migrate
  1. 使用Laravel Filament建立資料管理UI:
composer require filament/filament
php artisan filament:install
php artisan make:filament-resource User
  1. 建立API資源和控制器:
php artisan make:resource UserResource
php artisan make:controller Api/UserController --api
  1. 定義API路由於routes/api.php:
Route::middleware('auth:sanctum')->group(function () {
    Route::apiResource('users', Api\UserController::class);
});

Route::post('/login', [AuthController::class, 'login']);
Route::post('/register', [AuthController::class, 'register']);

這種組合提供了簡單易用的UI來管理資料結構,同時提供安全的JSON API認證伺服器功能,是開發者最容易上手且功能完整的解決方案。