【Laravel 開発入門】バリデーションとBladeテンプレートの活用

Laravelでは、リクエストのバリデーションを簡単に適用できる仕組みが提供されています。本記事では、以下の内容について詳しく解説します。

- `Request` クラスを使ったバリデーション
- Controller内でのバリデーション
- `Validator` クラスの活用
- Bladeテンプレートでのエラーメッセージの表示
- 動的なフィールド名のバリデーション
- `old` ヘルパーを用いたエラー時の入力保持

## 1. `Request` クラスを使ったバリデーション

バリデーションルールを `Request` クラス内で定義する方法です。

```php
namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class CommentRequest extends FormRequest
{
    public function rules()
    {
        return [
            'comment' => 'required|string|max:1000',
        ];
    }

    public function messages()
    {
        return [
            'comment.required' => 'コメントは必須です。',
            'comment.string' => 'コメントは文字列である必要があります。',
            'comment.max' => 'コメントは1000文字以内で入力してください。',
        ];
    }
}
```

Controllerで適用する際は以下のように記述します。

```php
use App\Http\Requests\CommentRequest;

public function store(CommentRequest $request)
{
    $validatedData = $request->validated();
    // 保存処理など
}
```

## 2. Controller内でのバリデーション

`Request` クラスを使わず、Controller内でバリデーションを適用する場合は以下のように記述します。

```php
public function store(Request $request)
{
    $validatedData = $request->validate([
        'comment' => 'required|string|max:1000',
    ], [
        'comment.required' => 'コメントは必須です。',
        'comment.string' => 'コメントは文字列である必要があります。',
        'comment.max' => 'コメントは1000文字以内で入力してください。',
    ]);

    // バリデーション通過後の処理
}
```

## 3. `Validator` クラスの活用

`Validator` クラスを使うと、より柔軟にバリデーションを実行できます。

```php
use Illuminate\Support\Facades\Validator;

public function store(Request $request)
{
    $validator = Validator::make($request->all(), [
        'comment' => 'required|string|max:1000',
    ], [
        'comment.required' => 'コメントは必須です。',
        'comment.string' => 'コメントは文字列である必要があります。',
        'comment.max' => 'コメントは1000文字以内で入力してください。',
    ]);

    if ($validator->fails()) {
        return redirect()->back()
            ->withErrors($validator)
            ->withInput();
    }

    // バリデーション通過後の処理
}
```

## 4. Bladeテンプレートでのエラーメッセージ表示

エラーメッセージをリスト形式で表示するには、以下のように記述します。

```html
@if ($errors->any())
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li class="_error-msg">{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif
```

特定のフィールドに対するエラーメッセージを表示するには `@error` ディレクティブを使用します。

```html
@error('comment')
    <div class="text-danger">{{ $message }}</div>
@enderror
```

## 5. 動的なフィールド名のバリデーション

`name="comment-{{ $comment->id }}"` のように動的にフィールド名を設定した場合、バリデーションメッセージもそれに合わせる必要があります。

Controller側では、以下のように記述します。

```php
$data = $request->validate([
    'comment-' . $id => 'required|string|max:1000',
], [
    'comment-' . $id . '.required' => 'コメントは必須です。',
    'comment-' . $id . '.string' => 'コメントは文字列である必要があります。',
    'comment-' . $id . '.max' => 'コメントは1000文字以内で入力してください。',
]);
```

Bladeテンプレート側では、エラー時に `old` ヘルパーを使って値を保持します。

```html
@foreach ($comments as $comment)
    <textarea name="comment-{{ $comment->id }}">
        {{ old('comment-' . $comment->id, 'comment-' . $comment->id) }}
    </textarea>
@endforeach
```

`old('comment-' . $comment->id, 'comment-' . $comment->id)` により、エラー時にはセッションの値を表示し、それ以外はデフォルト値を表示できます。

## まとめ

本記事では、Laravelのバリデーションの基本と、Bladeテンプレートでのエラーメッセージの表示方法について解説しました。

- `Request` クラスを使う方法
- Controller内でバリデーションを行う方法
- `Validator` クラスの活用
- `old` ヘルパーでエラー時の入力保持
- 動的なフィールド名のバリデーション

これらの仕組みを理解することで、柔軟にフォームバリデーションを実装することが可能となります。