Laravel Eloquent是一种简单的方式来与你的数据库互动. 它是一个对象关系映射器(ORM),通过提供一个与表互动的模型,简化了数据库的复杂性。
因此,Laravel Eloquent有很好的工具来创建和测试API来支持你的开发. 在这篇实践文章中, 你将看到使用Laravel创建和测试API是多么容易.
在这个演示中, 你将开始创建一个模型,你可以用它来建立API和数据库表。然后, 你会看到如何添加一个控制器作为业务逻辑层和一个路由来完成API。然后,你将学习如何使用Postman来执行测试API,最后再重点讨论认证和错误处理。
先决条件
要开始,这里是你需要的东西:
-
- Laravel version 8 or 9
- Composer
- Postman
- XAMPP
- 对API和PHP的基本知识
API基础知识
首先,使用<code>composer</code>创建一个新的Laravel项目:
composer create-project laravel/laravel laravel-api-create-test
要启动服务器,执行以下命令,在8000端口运行应用服务器:
cd laravel-api-create-test php artisan serve
你应该看到以下屏幕:
Laravel
然后,使用下面的代码创建一个带有 -m
标志的模型来进行迁移:
php artisan make:model Product -m
现在升级迁移文件以包括所需字段。在数据库/migrations/{date_stamp}_create_products_table.php文件内添加产品模型的标题和描述字段以及这两个表字段。
$table->string('title'); $table->longText('description');
下一步是使这些字段可填充。在app/Models/Product.php中,使 title
和 description
成为可填充字段。
protected $fillable = ['title', 'description'];
如何创建一个控制器
现在,通过执行以下命令为产品创建一个控制器文件。这将创建app/Http/Controllers/Api/ProductController.php文件。
php artisan make:controller Api\\ProductController --model=Product
现在,添加创建和检索产品的逻辑。在 index
方法中,添加以下代码来检索所有产品:
$products = Product::all(); return response()->json([ 'status' => true, 'products' => $products ]);
之后,你必须添加一个 StoreProductRequest
类,用于将新产品存储在数据库中。在同一文件的顶部添加以下类。
public function store(StoreProductRequest $request) { $product = Product::create($request->all()); return response()->json([ 'status' => true, 'message' => "Product Created successfully!", 'product' => $product ], 200); }
现在,你将创建请求,你可以通过执行以下命令来完成:
php artisan make:request StoreProductRequest
如果你想添加验证,你可以使用app/Http/Requests/StoreProductRequest.php文件。在这个演示中,没有任何验证。
如何创建一个路由
测试API前的最后一步是添加一个路由。要做到这一点,在routes/api.php文件中添加以下代码。在文件的开头添加 use
语句,在正文中添加 Route
语句:
use App\Http\Controllers\Api\ProductController; Route::apiResource('products', ProductController::class);
在你开始测试API之前,确保products表在你的数据库中。如果它不存在,用XAMPP这样的控制面板创建一个。或者,你可以执行以下命令来迁移数据库:
php artisan migrate
如何测试一个API
在测试API之前,请确保app/Http/Requests/StoreProductRequest.php中的<code>authorize</code>方法设置为返回<code>true</code>。
现在,您可以使用Postman创建一个新产品。首先点击此URL的 POST
请求:http://127.0.0.1:8000/api/products/.因为这是一个创建新产品的 POST
请求,所以必须传递一个带有标题和描述的JSON对象。
{ "title":"Apple", "description":"Best Apples of the world" }
在Postman中创建一个新产品
点击Send按钮后,你应该看到以下内容:
点击 “Send” 后
现在,使用 GET
请求来获取所创建的产品。URL是一样的。结果将如下所示:
通过GET请求获取的产品
如何使用Sanctum认证API
在保证API安全的情况下,认证是至关重要的。Laravel通过提供Sanctum令牌的功能使之变得简单,你可以将其作为中间件使用。当用户使用正确的凭证登录时,它可以使用生成的令牌来保护API的安全。记住,没有令牌,用户就不能访问安全的API。
添加认证的第一步是使用下面的代码添加一个Sanctum包:
composer require laravel/sanctum
然后,发布Sanctum的配置文件:
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
之后,添加Sanctum的token作为中间件。在app/Http/Kernel.php文件中,使用以下类,并在受保护的中间件组的API中用以下代码替换 middlewareGroups
。
use Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful;
protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, // \Illuminate\Session\Middleware\AuthenticateSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, ], 'api' => [ EnsureFrontendRequestsAreStateful::class, 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], ];
下一步是创建一个 UserController
,并添加代码以获取令牌进行认证。
php artisan make:controller UserController
创建完 UserController
后,导航到app/Http/Controllers/UserController.php文件,用以下代码替换现有代码:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\User; use Illuminate\Support\Facades\Hash; class UserController extends Controller { // function index(Request $request) { $user= User::where('email', $request->email)->first(); // print_r($data); if (!$user || !Hash::check($request->password, $user->password)) { return response([ 'message' => ['These credentials do not match our records.'] ], 404); } $token = $user->createToken('my-app-token')->plainTextToken; $response = [ 'user' => $user, 'token' => $token ]; return response($response, 201); } }
在你测试认证之前,先创建一个采用种子机的用户。下面的命令创建了一个UsersTableSeeder文件。
php artisan make:seeder UsersTableSeeder
在database/seeders/UsersTableSeeder.php文件中,用下面的代码替换现有的代码,为用户提供seed:
<?php namespace Database\Seeders; use Illuminate\Database\Seeder; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Hash; class UsersTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { DB::table('users')->insert([ 'name' => 'John Doe', 'email' => 'john@doe.com', 'password' => Hash::make('password') ]); } }
现在用这个命令运行seeder:
php artisan db:seed --class=UsersTableSeeder
认证流程中剩下的最后一步是使用创建的中间件来保护路由。导航到routes/api.php文件,在中间件内添加产品路由。
use App\Http\Controllers\UserController; Route::group(['middleware' => 'auth:sanctum'], function () { Route::apiResource('products', ProductController::class); }); Route::post("login",[UserController::class,'index']);
在向中间件添加路由后,如果你试图获取产品,你会得到一个内部服务器错误。
添加路由后出现内部服务器错误
但是,一旦你登录,得到一个令牌,并在标题中使用它,它就会认证你并开始工作。你可以向http://127.0.0.1:8000/api/login 发送一个POST请求,其正文如下:
{ "email":"john@doe.com", "password":"password" }
认证成功
使用收到的令牌作为承载令牌,并将其添加为授权头。
添加承载者标记作为授权标头
如何处理API的错误
每当你向服务器发送请求时,它都会做出响应。随着响应的进行,它也会根据响应的性质发送一个状态代码。例如,200状态代码表明请求已经成功,而404则表明服务器无法找到所请求的资源。
然而,一个状态代码是不够的。一个人类可读的错误信息是必需的。Laravel有很多方法来处理错误. 你可以使用try-catch块, fallback方法, 或者发送一个自定义的响应. 下面你添加到 UserController
中的代码演示了这一点。
if (!$user || !Hash::check($request->password, $user->password)) { return response([ 'message' => ['These credentials do not match our records.'] ], 404); }
小结
Laravel的Eloquent Model使得创建, 验证, 和测试API变得毫不费力. 它的对象关系映射提供了一个直接的方法来与数据库进行交互。
此外, 作为中间件, Laravel的Sanctum token可以帮助你快速确保你的API的安全.
评论留言