【Laravel】バリデーションルールの基本とカスタムルールの作り方

【Laravel】バリデーションルールの基本とカスタムルールの作り方 Laravel

Laravelでは、フォームから送信されたデータに対して簡潔かつ強力なバリデーション機能を利用することができます。この記事では、基本的なバリデーションルールの使い方と、より柔軟なバリデーションを実現するためのカスタムルールの作成方法について解説します。

Laravelのバリデーションの基本

Laravelでは、validateメソッドを使ってリクエストデータを検証することができます。もっとも一般的なのが、コントローラー内で以下のように記述する方法です。

public function store(Request $request)
{
    $validated = $request->validate([
        'name' => 'required|string|max:255',
        'email' => 'required|email|unique:users,email',
        'age' => 'nullable|integer|min:18',
    ]);
    
    // バリデーション通過後の処理
}

この例では、name、email、ageの各フィールドに対して、複数のルールをパイプ(|)でつなげて定義しています。バリデーションに失敗した場合、自動的に前のページにリダイレクトされ、エラーメッセージがセッションに格納されます。

よく使われるバリデーションルール一覧

Laravelが提供する主なルールには以下のようなものがあります。

  • required: 必須項目
  • string: 文字列であること
  • integer: 整数であること
  • email: メールアドレス形式
  • unique: 一意であること(例: unique:users,email)
  • min: 最小値または最小文字数
  • max: 最大値または最大文字数
  • confirmed: 同名フィールドとの一致確認(例: password と password_confirmation)

これらを組み合わせることで、柔軟かつ安全な入力チェックが可能です。

フォームリクエストによるバリデーションの分離

バリデーションロジックをコントローラーから分離したい場合は、Laravelの「フォームリクエスト」を活用します。以下のようにコマンドでリクエストクラスを作成します。

php artisan make:request StoreUserRequest

生成されたクラス内のrulesメソッドでバリデーションを定義し、コントローラーで型を指定するだけで自動的にバリデーションが実行されます。

public function rules()
{
    return [
        'name' => 'required|string|max:255',
        'email' => 'required|email|unique:users,email',
    ];
}

カスタムバリデーションルールの作り方

Laravelでは、標準のルールでは対応できないケースに対して、独自のバリデーションルールを定義することができます。

まずは artisan コマンドでルールクラスを生成します。

php artisan make:rule AlphaSpace

生成されたapp/Rules/AlphaSpace.phpを編集します。

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class AlphaSpace implements Rule
{
    public function passes($attribute, $value)
    {
        return preg_match('/^[\pL\s]+$/u', $value);
    }

    public function message()
    {
        return ':attribute には文字とスペースのみを含めてください。';
    }
}

この例では、文字(アルファベット・日本語)とスペースのみを許可するルールです。

コントローラーでの使用方法は以下のとおりです。

use App\Rules\AlphaSpace;

$request->validate([
    'name' => ['required', new AlphaSpace],
]);

カスタムエラーメッセージの設定

デフォルトのメッセージでは不十分な場合、エラーメッセージをカスタマイズすることも可能です。

$request->validate([
    'email' => 'required|email',
], [
    'email.required' => 'メールアドレスは必須です。',
    'email.email' => '正しいメールアドレス形式で入力してください。',
]);

複数言語対応が必要な場合は、resources/lang/ja/validation.phpを編集することで、アプリ全体に適用される翻訳ファイルとして活用できます。

まとめ

Laravelのバリデーションは、シンプルながら非常に柔軟な設計となっており、バリデーションルールの基本からフォームリクエスト、さらにはカスタムルールまで対応可能です。バリデーションの設計を丁寧に行うことで、ユーザー体験の向上やセキュリティ対策にもつながります。