こんにちは、PHP開発者の皆さん!この連載の第5回では、Laravel 10を使ってバリデーションとエラーハンドリングを実装する方法について詳しく解説します。バリデーションは、入力データの正当性を確認するために不可欠なステップであり、エラーハンドリングはアプリケーションの信頼性を高めるために重要です。それでは、始めましょう!
1. バリデーションの基本
Laravelでは、リクエストデータのバリデーションを簡単に行うための仕組みが提供されています。コントローラメソッド内でvalidate
メソッドを使用することで、バリデーションルールを適用できます。
バリデーションの例
以下は、store
メソッドでバリデーションを行う例です。
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);
}
}
PHPvalidate
メソッドは、バリデーションに失敗した場合に自動的に適切なエラーレスポンスを返します。
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回 認証と認可の導入
コメント