第5回 バリデーションとエラーハンドリング

Laravel WebAPI開発

こんにちは、PHP開発者の皆さん!この連載の第5回では、Laravel 10を使ってバリデーションとエラーハンドリングを実装する方法について詳しく解説します。バリデーションは、入力データの正当性を確認するために不可欠なステップであり、エラーハンドリングはアプリケーションの信頼性を高めるために重要です。それでは、始めましょう!

1. バリデーションの基本

Laravelでは、リクエストデータのバリデーションを簡単に行うための仕組みが提供されています。コントローラメソッド内でvalidateメソッドを使用することで、バリデーションルールを適用できます。

バリデーションの例

以下は、storeメソッドでバリデーションを行う例です。

app/Http/Controllers/Api/PostController.php
namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Models\Post;
use Illuminate\Http\Request;

class PostController extends Controller
{
    public function store(Request $request)
    {
        $validated = $request->validate([
            'title' => 'required|string|max:255',
            'body' => 'required|string',
        ]);

        $post = Post::create($validated);

        return response()->json($post, 201);
    }
}
PHP

validateメソッドは、バリデーションに失敗した場合に自動的に適切なエラーレスポンスを返します。

2. カスタムバリデーションメッセージ

デフォルトのバリデーションメッセージをカスタマイズすることも可能です。validateメソッドの第2引数としてメッセージ配列を渡します。

カスタムメッセージの例

$validated = $request->validate([
    'title' => 'required|string|max:255',
    'body' => 'required|string',
], [
    'title.required' => 'タイトルは必須項目です。',
    'body.required' => '本文は必須項目です。',
]);
PHP

これにより、デフォルトのエラーメッセージが指定したカスタムメッセージに置き換えられます。

3. フォームリクエストを使用したバリデーション

フォームリクエストを使用すると、バリデーションロジックをコントローラから分離し、クリーンに保つことができます。

フォームリクエストの生成

以下のコマンドを実行してフォームリクエストクラスを生成します。

./vendor/bin/sail artisan make:request StorePostRequest
Bash

生成されたフォームリクエストクラスを開き、バリデーションルールを定義します。

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StorePostRequest extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'title' => 'required|string|max:255',
            'body' => 'required|string',
        ];
    }

    public function messages()
    {
        return [
            'title.required' => 'タイトルは必須項目です。',
            'body.required' => '本文は必須項目です。',
        ];
    }
}
PHP

フォームリクエストの使用

コントローラでフォームリクエストを使用します。

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Http\Requests\StorePostRequest;
use App\Models\Post;

class PostController extends Controller
{
    public function store(StorePostRequest $request)
    {
        $post = Post::create($request->validated());

        return response()->json($post, 201);
    }
}
PHP

これにより、バリデーションロジックが整理され、再利用可能になります。

4. エラーハンドリング

エラーハンドリングは、予期しない状況に対処し、ユーザーに適切なフィードバックを提供するために重要です。Laravelでは、例外をキャッチしてカスタムレスポンスを返す方法が提供されています。

カスタムエラーハンドリング

例外をキャッチしてカスタムエラーレスポンスを返すには、app/Exceptions/Handler.php ファイルを編集します。

namespace App\Exceptions;

use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Throwable;
use Illuminate\Http\JsonResponse;

class Handler extends ExceptionHandler
{
    public function render($request, Throwable $exception)
    {
        if ($request->is('api/*')) {
            return response()->json([
                'message' => $exception->getMessage()
            ], $this->isHttpException($exception) ? $exception->getStatusCode() : 500);
        }

        return parent::render($request, $exception);
    }
}
PHP

これにより、APIリクエストの場合に例外が発生すると、カスタムJSONレスポンスが返されます。

5. グローバルエラーハンドリング

特定のエラーレスポンスをグローバルに処理したい場合、ミドルウェアを使用することもできます。たとえば、認証エラーやアクセス拒否エラーを統一的に処理するためにミドルウェアを作成します。

ミドルウェアの作成

以下のコマンドを実行してミドルウェアを生成します。

./vendor/bin/sail artisan make:middleware ApiExceptionMiddleware
Bash

生成されたミドルウェアを開き、エラーハンドリングロジックを追加します。

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Throwable;

class ApiExceptionMiddleware
{
    public function handle(Request $request, Closure $next)
    {
        try {
            return $next($request);
        } catch (Throwable $exception) {
            return response()->json([
                'message' => $exception->getMessage()
            ], $this->isHttpException($exception) ? $exception->getStatusCode() : 500);
        }
    }

    protected function isHttpException(Throwable $exception)
    {
        return method_exists($exception, 'getStatusCode');
    }
}
PHP

このミドルウェアをAPIルートに適用するために、app/Http/Kernel.php ファイルを編集します。

protected $middlewareGroups = [
    'api' => [
        // 他のミドルウェア
        \App\Http\Middleware\ApiExceptionMiddleware::class,
    ],
];
PHP

これにより、APIリクエスト全体にエラーハンドリングミドルウェアが適用されます。

6. まとめ

この記事では、Laravel 10でのバリデーションとエラーハンドリングの方法について解説しました。入力データのバリデーションを行うことで、アプリケーションの信頼性を高めることができます。また、エラーハンドリングを適切に実装することで、ユーザーにとって使いやすいAPIを提供することができます。次回は、APIの認証と認可について学びます。それでは、次の記事でお会いしましょう!

次の記事: 第6回 認証と認可の導入

コメント

タイトルとURLをコピーしました