Laravel API: Laravel で API を作成してテストする
公開: 2023-05-10Laravel Eloquent は、データベースと対話する簡単な方法です。 これは、テーブルと対話するモデルを提供することでデータベースの複雑さを簡素化するオブジェクト リレーショナル マッパー (ORM) です。
そのため、Laravel Eloquent には、開発をサポートする API を作成およびテストするための優れたツールが用意されています。 この実践的な記事では、Laravel を使用して API を作成およびテストすることがいかに簡単であるかがわかります。
このデモでは、API とデータベース テーブルの構築に使用できるモデルを作成することから始めます。 次に、コントローラーをビジネス ロジック レイヤーとして追加し、API を完成させるルートを追加する方法を示します。 次に、Postman を使用して API のテストを実行する方法を学び、最後に認証とエラー処理に焦点を当てます。
前提条件
始めるには、次のものが必要です。
- Laravelバージョン8または9
- 作曲
- 郵便屋さん
- 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
次の画面が表示されるはずです。
次に、以下のコードを使用して、移行用の-m
フラグを指定したモデルを作成します。
php artisan make:model Product -m
次に、移行ファイルをアップグレードして、必要なフィールドを含めます。 製品モデルのタイトルと説明フィールド、およびこれら 2 つのテーブル フィールドを、database/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: http://127.0.0.1:8000/api/products/ に対してPOST
リクエストを送信します。 これは新しい製品を作成するためのPOST
リクエストであるため、タイトルと説明を含む JSON オブジェクトを渡す必要があります。
{ "title":"Apple", "description":"Best Apples of the world" }
[送信]ボタンをクリックすると、次のように表示されます。
次に、 GET
リクエストを使用して、作成されたプロダクトを取得します。 URLは同じです。 結果は次のようになります。
Sanctum を使用して API を認証する方法
API を保護する場合、認証は非常に重要です。 Laravel は、ミドルウェアとして使用できる Sanctum トークンの機能を提供することで、これを容易にします。 ユーザーが正しい認証情報を使用してログインしたときに生成されるトークンを使用して API を保護します。 ユーザーはトークンなしでは保護された API にアクセスできないことに注意してください。
認証を追加する最初のステップは、以下のコードを使用して Sanctum パッケージを追加することです。
composer require laravel/sanctum
次に、Sanctum 構成ファイルを公開します。
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
その後、Sanctumのトークンをミドルウェアとして追加します。 app/Http/Kernel.phpファイル内で、次のクラスを使用し、 middlewareGroups
保護されたミドルウェア グループの API 内の次のコードに置き換えます。
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ファイル内で、既存のコードを次のコードに置き換えてユーザーをシードします。
<?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' => '[email protected]', 'password' => Hash::make('password') ]); } }
次に、次のコマンドを使用してシーダーを実行します。
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']);
ミドルウェアにルートを追加した後、製品を取得しようとすると内部サーバー エラーが発生します。
ただし、ログインしてトークンを取得し、それをヘッダーで使用すると、認証されて動作が開始されます。 次の本文を使用して POST リクエストを http://127.0.0.1:8000/api/login に送信できます。
{ "email":"[email protected]", "password":"password" }
Bearer トークンとして受信したトークンを使用し、それを Authorization ヘッダーとして追加します。
API エラーの処理方法
サーバーにリクエストを送信すると、サーバーは応答します。 応答とともに、応答の性質に応じてステータス コードも送信します。 たとえば、ステータス コード 200 はリクエストが成功したことを示し、ステータス コード 404 はサーバーがリクエストされたリソースを見つけられなかったことを示します。
ただし、ステータス コードだけでは十分ではありません。 人間が読めるエラー メッセージが必要です。 Laravel にはエラーを処理するためのさまざまな方法が用意されています。 try-catch ブロック、フォールバック メソッドを使用するか、カスタム応答を送信することができます。 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 トークンはミドルウェアとして機能し、API を迅速に保護するのに役立ちます。
さらに最適化が必要な場合は、Kinstaのデータベースホスティングソリューションを使用すると、すべてのWebプロジェクトのデータベースのセットアップと管理が簡素化されます。