Laravel API: Laravel で API を作成してテストする

公開: 2023-05-10

Laravel 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

次の画面が表示されるはずです。

Laravelのランディングページ
ララベル

次に、以下のコードを使用して、移行用の-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内で、 titledescriptionフィールドを入力可能にします。

 protected $fillable = ['title', 'description'];
次のバイラルアプリのアイデアがあると思いますか? API をすばやく作成してテストする方法は次のとおりです ️ クリックしてツイート

コントローラーの作成方法

次に、次のコマンドを実行して、製品のコントローラー ファイルを作成します。 これにより、 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" }
Postman での新しい製品の作成
Postman での新しい製品の作成

[送信]ボタンをクリックすると、次のように表示されます。

「送信」をクリックした後の郵便配達員
「送信」をクリックした後

次に、 GETリクエストを使用して、作成されたプロダクトを取得します。 URLは同じです。 結果は次のようになります。

GETリクエストで取得した商品。
GETリクエストで取得した商品。

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 ヘッダーとして追加します。

Bearer トークンを Authorization ヘッダーとして追加する
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); }
データベースの複雑さを気にせずに、API 開発の楽しい部分に集中してください。 クリックしてツイートする方法は次のとおりです

まとめ

Laravel の Eloquent Model を使用すると、API の作成、検証、テストが簡単になります。 そのオブジェクト リレーショナル マッピングは、データベースと対話するための簡単なアプローチを提供します。

さらに、Laravel の Sanctum トークンはミドルウェアとして機能し、API を迅速に保護するのに役立ちます。

さらに最適化が必要な場合は、Kinstaのデータベースホスティングソリューションを使用すると、すべてのWebプロジェクトのデータベースのセットアップと管理が簡素化されます。