在Laravel中创建和测试API - Kinsta

作者:API传播员 · 2025-11-15 · 阅读时间:6分钟

Laravel Eloquent 是一种与数据库交互的简便方式。作为一个对象关系映射器(ORM),它通过提供与表交互的模型,极大地简化了数据库操作的复杂性。在本文中,我们将详细介绍如何使用 Laravel 创建和测试 API,并通过实践展示其便捷性。


先决条件

在开始之前,您需要准备以下内容:

  • 安装 PHP 和 Composer。
  • 配置好 Laravel 开发环境。
  • 数据库服务(如 MySQL 或 SQLite)。

API 基础知识

创建 Laravel 项目

首先,使用 Composer 创建一个新的 Laravel 项目:

composer create-project laravel/laravel laravel-api-create-test

然后,启动开发服务器:

cd laravel-api-create-test
php artisan serve

此命令将在默认的 http://127.0.0.1:8000 上运行服务器。

创建模型和迁移

接下来,使用以下命令创建一个模型,并同时生成迁移文件:

php artisan make:model Product -m

编辑生成的迁移文件(database/migrations/{timestamp}_create_products_table.php),为 products 表添加以下字段:

$table->string('title');
$table->longText('description');

运行迁移以创建数据库表:

php artisan migrate

app/Models/Product.php 文件中,设置可填充字段:

protected $fillable = ['title', 'description'];

创建控制器

通过以下命令为 Product 模型创建控制器:

php artisan make:controller Api/ProductController --model=Product

在生成的 app/Http/Controllers/[Api](https://www.explinks.com/wiki/api/)/ProductController.php 文件中,添加以下逻辑:

  • 获取所有产品
public function index() {
    $products = Product::all();
    return response()->json(['status' => true, 'products' => $products]);
}
  • 存储新产品

首先,创建一个请求类:

php artisan make:request StoreProductRequest

然后,在 store 方法中添加以下代码:

public function store(StoreProductRequest $request) {
    $product = Product::create($request->all());
    return response()->json(['status' => true, 'message' => '产品创建成功!', 'product' => $product], 200);
}

定义路由

routes/api.php 文件中,添加以下代码以定义 API 路由:

use AppHttpControllersApiProductController;

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

确保数据库中存在 products 表。如果表尚未创建,可以通过以下命令运行迁移:

php artisan migrate

测试 API

在测试 API 之前,确保 app/Http/Requests/StoreProductRequest.php 文件中的 authorize 方法返回 true

使用 Postman 测试

  1. 创建新产品

    • 请求类型:POST
    • URL:http://127.0.0.1:8000/api/products
    • 请求体(JSON 格式):

      {
       "title": "苹果",
       "description": "世界上最好的苹果"
      }
  2. 获取所有产品

    • 请求类型:GET
    • URL:http://127.0.0.1:8000/api/products

使用 Sanctum 验证 API

为了保护 API 安全,可以使用 Laravel Sanctum 提供的令牌身份验证功能。

安装 Sanctum

  1. 安装 Sanctum 包:

    composer require laravel/sanctum
  2. 发布 Sanctum 配置文件:

    php artisan vendor:publish --provider="LaravelSanctumSanctumServiceProvider"
  3. app/Http/Kernel.php 文件中,将 Sanctum 中间件添加到 api 中间件组:

   use LaravelSanctumHttpMiddlewareEnsureFrontendRequestsAreStateful;

   protected $middlewareGroups = [
       'api' => [
           EnsureFrontendRequestsAreStateful::class,
           'throttle:api',
           IlluminateRoutingMiddlewareSubstituteBindings::class,
       ],
   ];

创建用户控制器

通过以下命令创建用户控制器:

php artisan make:controller UserController

app/Http/Controllers/UserController.php 文件中,添加以下代码以实现用户登录和令牌生成:

public function index(Request $request) {
    $user = User::where('email', $request->email)->first();

    if (!$user || !Hash::check($request->password, $user->password)) {        return response(['message' => ['这些凭据与我们的记录不匹配。']], 404);
    }    $token = $user->createToken('my-app-token')->plainTextToken;    return response(['user' => $user, 'token' => $token], 201);
}

创建用户种子数据

通过以下命令生成用户种子文件:

php artisan make:seeder UsersTableSeeder

database/seeders/UsersTableSeeder.php 文件中,添加以下代码:

DB::table('users')->insert([
    'name' => 'John Doe',
    'email' => 'johndoe@example.com',
    'password' => Hash::make('password'),
]);

运行种子:

php artisan db:seed --class=UsersTableSeeder

保护路由

routes/api.php 文件中,添加以下代码以保护产品路由:

use AppHttpControllersUserController;

Route::post('login', [UserController::class, 'index']);Route::middleware('auth:sanctum')->group(function () {
    Route::apiResource('products', ProductController::class);
});

处理 API 错误

Laravel 提供了多种方法来处理 API 错误,例如使用 try-catch 块或自定义响应。例如:


if (!$user || !Hash::check($request->password, $user->password)) {    return response(['message' => ['这些凭据与我们的记录不匹配。']], 404);
}

总结

通过 Laravel 的 Eloquent 模型和 Sanctum 中间件,您可以轻松创建、测试和保护 API。Eloquent 提供了与数据库交互的高效方式,而 Sanctum 则为 API 提供了安全保障。

希望本文能帮助您快速上手 Laravel API 的开发与测试!

原文链接: https://kinsta.com/blog/laravel-api/