当前位置:首页 > 问答 > 正文

API接口 框架实战 laravel开发api实例与应用详解

🚀 当移动端遇上Laravel:用API构建丝滑用户体验
想象一下:用户打开你的APP,点击"发布动态",0.3秒内文字和图片就飞到了服务器,同时收到其他用户的点赞通知,这种流畅体验的背后,正是今天要揭秘的Laravel API开发实战!

🔧 环境搭建:3分钟极速启动

composer create-project laravel/laravel api-demo --prefer-dist
cd api-demo
php artisan serve

小技巧:用ServBay管理本地环境,PHP8.4+MySQL8.0一键配置,告别版本地狱!

🔒 认证三剑客:选对武器很重要

🛡️ Sanctum(轻量级首选)

// 安装
composer require laravel/sanctum
php artisan migrate
// 用户模型添加
use Laravel\Sanctum\HasApiTokens;
class User extends Authenticatable { use HasApiTokens; }
// 生成Token
$token = $user->createToken('mobile-app')->plainTextToken;

✅ 适用场景:移动端/SPA单页面应用,10行代码搞定认证

🎯 Passport(OAuth2全功能)

composer require laravel/passport
php artisan migrate
php artisan passport:install

🔑 生成客户端:

$client = Passport::client()->create(['name' => 'iOS App']);
$token = $user->createToken('iOS')->accessToken;

✅ 适用场景:开放平台/第三方接入,支持PKCE等高级流程

API接口 框架实战 laravel开发api实例与应用详解

🛣️ 路由设计:RESTful vs 资源路由

// 基础版
Route::apiResource('posts', PostController::class);
// 进阶版(带版本)
Route::prefix('v1')->group(function() {
    Route::apiResource('posts', PostController::class);
});

💡 版本控制小贴士

API接口 框架实战 laravel开发api实例与应用详解

  • 推荐URL路径版本(/api/v1/posts
  • 配合Accept头实现平滑过渡:
    Accept: application/vnd.api.v1+json

📦 响应标准化:让前端更省心

// app/Http/Resources/PostResource.php
public function toArray($request) {
    return [
        'id' => $this->id,
        'content' => $this->content,
        'created_at' => (string)$this->created_at,
        'links' => [
            'self' => route('posts.show', $this->id)
        ]
    ];
}
// 控制器中使用
return new PostResource($post);

🎯 统一响应结构

API接口 框架实战 laravel开发api实例与应用详解

{
    "success": true,
    "data": {...},
    "meta": {
        "page": 1,
        "per_page": 15
    }
}

🚨 异常处理:让错误会说话

// 创建自定义异常
class InvalidApiKeyException extends \Exception {}
// 在Handler.php中捕获
public function register() {
    $this->renderable(function(InvalidApiKeyException $e) {
        return response()->json(['error' => 'Invalid API Key'], 403);
    });
}
// 全局中间件拦截
public function handle($request, Closure $next) {
    if (!api_key_valid()) {
        throw new InvalidApiKeyException();
    }
    return $next($request);
}

🧪 测试黑科技:Apipost + Spectator

🔍 Apipost智能测试

  1. 导入Postman集合
  2. AI自动生成测试用例(支持正反向测试)
  3. 一键执行压力测试(1000+并发)

📜 Spectator合同测试

# openapi.yaml
paths:
  /posts:
    post:
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                title: {type: string}
// 运行合同测试
php artisan test --filter=SpectatorTest

📊 实战案例:用户动态API

📝 创建动态

// 路由
Route::post('/posts', [PostController::class, 'store']);
// 控制器
public function store(StorePostRequest $request) {
    $post = Auth::user()->posts()->create($request->validated());
    return new PostResource($post);
}

🔍 查询动态

// 带过滤的查询
Route::get('/posts', [PostController::class, 'index']);
public function index(Request $request) {
    $posts = Post::query()
        ->when($request->has('category'), function($q) use ($request) {
            $q->where('category_id', $request->category);
        })
        ->paginate(15);
    return PostResource::collection($posts);
}

🚀 性能优化三板斧

  1. 缓存策略

    Route::get('/popular-posts', function() {
     return Cache::remember('popular_posts', 3600, function() {
         return Post::orderBy('views', 'desc')->limit(10)->get();
     });
    });
  2. 速率限制

    Route::middleware('throttle:60,1')->group(function() {
     Route::get('/user/{id}', [UserController::class, 'show']);
    });
  3. 数据库优化

  • 使用with预加载关联数据
  • 善用whereIn批量查询
  • 定期清理无用索引

📚 学习资源推荐

  1. 官方文档Laravel API
  2. 实战课程Laravel API全攻略
  3. 测试工具Apipost官网

💬 互动话题:你在API开发中遇到过哪些坑?是认证问题还是性能瓶颈?欢迎在评论区分享你的故事!

发表评论