Laravel 学習 (バリデーション)

## バリデーション

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604560/52b612e9-0a99-df61-54bb-67c43fa2b8f3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604560/f6fc3ac1-56ee-5a8e-fa9f-b3d9c9fd435e.png)

送信ボタンを押した際にバリデーションチェックをし、問題があればエラーメッセージを表示させます。

``` php:\routes\web.php
Route::get('/hello','App\Http\Controllers\HelloController@index');

Route::post('/hello','App\Http\Controllers\HelloController@post');
```

``` php:\app\Http\Controllers\HelloController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;

class HelloController extends Controller
{
    public function index(Request $request) {
        $data = [
            'msg'=>'フォームを入力'
        ];
        return view('hello.index', $data);
    }

    public function post(Request $request) {
        $request->validate([
            'id' => 'integer|between:1, 10',
            'name' => 'required'
        ]);
        return view('hello.index', ['msg'=>'正常']);

    }
}
```

``` php
        $request->validate([
            'id' => 'integer|between:1, 10',
            'name' => 'required'
        ]);
```
ここでidは整数であり、1~10までであること。
nameは入力必須であることとしています。

integerは空値で送信するとintegerとして認識されずバリデーションエラーになります。
他にもemailか、日付かといったチェックもできます。


``` php:\resources\views\hello\index.blade.php
<html>
<body>
   <p>{{$msg}}</p>
   @if (count($errors) > 0)
      <p>異常</p>
   @endif
   <form action="hello" method="post">
      @csrf
      @if ($errors->has('id'))
         <p>msg:{{$errors->first('id')}}</p>
      @endif
      <label for="id">id</label>
      <input type="text" id="id" name="id" value="{{old('id')}}"><br>
      @if($errors->has('name'))
         <p>msg:{{$errors->first('name')}}</p>
      @endif
      <label for="name">name</label>
      <input type="text" id="name" name="name" value="{{old('name')}}">
      <button type="submit">送信</button>
   </form>
</body>
</html>
```

``` php
<form action="hello" method="post">
```

actionを「hello」にするか「/hello」にするかでURLが変わります。
hello: http://localhost/Laravelプロジェクト/public/hello
/hello: http://localhost/hello

``` php
{old('name')
```
oldを使うことで前回の送信値をセットできます。

## バリデーションルール

項目が多かったのでchatGPTに出力してもらいました。

1. **accepted**  
   - `true`、`1`、`yes`、`on` などの値を許可します。

2. **active_url**  
   - 有効なURLであることを確認します。

3. **after:date**  
   - 指定した日付以降の日付であることを確認します。

4. **after_or_equal:date**  
   - 指定した日付と同じかそれ以降の日付であることを確認します。

5. **alpha**  
   - アルファベットのみを許可します。

6. **alpha_dash**  
   - アルファベット、数字、ダッシュ（-）、アンダースコア（_）のみを許可します。

7. **alpha_num**  
   - アルファベットと数字のみを許可します。

8. **array**  
   - 配列であることを確認します。

9. **before:date**  
   - 指定した日付以前の日付であることを確認します。

10. **before_or_equal:date**  
    - 指定した日付と同じかそれ以前の日付であることを確認します。

11. **between:min,max**  
    - 指定した範囲内の値であることを確認します（文字列の長さ、数値、ファイルサイズなど）。

12. **boolean**  
    - `true`、`false`、`1`、`0`のみを許可します。

13. **confirmed**  
    - 指定したフィールドと一致することを確認します。例えば、`password` フィールドに対応する `password_confirmation` フィールドが必要です。

14. **date**  
    - 有効な日付であることを確認します。

15. **date_equals:date**  
    - 指定した日付と同じであることを確認します。

16. **date_format:format**  
    - 指定した形式の日付であることを確認します。

17. **different:field**  
    - 他のフィールドと異なることを確認します。

18. **digits:value**  
    - 指定した桁数であることを確認します。

19. **digits_between:min,max**  
    - 指定した範囲の桁数であることを確認します。

20. **dimensions**  
    - 画像の幅、高さ、アスペクト比などを確認します。

21. **distinct**  
    - 配列内の要素が一意であることを確認します。

22. **email**  
    - 有効なメールアドレスであることを確認します。

23. **ends_with:values**  
    - 指定した値のいずれかで終わることを確認します。

24. **exists:table,column**  
    - データベース内に存在することを確認します。

25. **file**  
    - アップロードされたファイルであることを確認します。

26. **filled**  
    - 値が入力されていることを確認します。

27. **gt:field**  
    - 他のフィールドの値より大きいことを確認します。

28. **gte:field**  
    - 他のフィールドの値以上であることを確認します。

29. **image**  
    - 画像ファイル（jpeg、png、bmp、gif、svg、webp）であることを確認します。

30. **in:values**  
    - 指定した値のいずれかであることを確認します。

31. **integer**  
    - 整数であることを確認します。

32. **ip**  
    - 有効なIPアドレスであることを確認します。

33. **ipv4**  
    - 有効なIPv4アドレスであることを確認します。

34. **ipv6**  
    - 有効なIPv6アドレスであることを確認します。

35. **json**  
    - 有効なJSON文字列であることを確認します。

36. **lt:field**  
    - 他のフィールドの値より小さいことを確認します。

37. **lte:field**  
    - 他のフィールドの値以下であることを確認します。

38. **max:value**  
    - 最大値を超えないことを確認します（文字列の長さ、数値、ファイルサイズなど）。

39. **mimes:types**  
    - 指定したMIMEタイプのファイルであることを確認します（例：`mimes:jpg,bmp,png`）。

40. **mimetypes:types**  
    - 指定したファイルタイプであることを確認します（例：`mimetypes:image/jpeg,audio/mp3`）。

41. **min:value**  
    - 最小値以上であることを確認します（文字列の長さ、数値、ファイルサイズなど）。

42. **not_in:values**  
    - 指定した値のいずれでもないことを確認します。

43. **not_regex:pattern**  
    - 正規表現パターンに一致しないことを確認します。

44. **nullable**  
    - フィールドがnullであることを許可します。

45. **numeric**  
    - 数字であることを確認します。

46. **present**  
    - フィールドが存在することを確認します。

47. **regex:pattern**  
    - 正規表現パターンに一致することを確認します。

48. **required**  
    - 必須項目です。

49. **required_if:anotherfield,value**  
    - 他のフィールドの値に応じて必須となります。

50. **required_unless:anotherfield,value**  
    - 他のフィールドの値に一致しない限り必須となります。

51. **required_with:fields**  
    - 指定したフィールドが存在する場合は必須となります。

52. **required_with_all:fields**  
    - 指定したすべてのフィールドが存在する場合は必須となります。

53. **required_without:fields**  
    - 指定したフィールドが存在しない場合は必須となります。

54. **required_without_all:fields**  
    - 指定したすべてのフィールドが存在しない場合は必須となります。

55. **same:field**  
    - 他のフィールドと一致することを確認します。

56. **size:value**  
    - サイズが指定した値であることを確認します（文字列の長さ、数値、ファイルサイズなど）。

57. **starts_with:values**  
    - 指定した値のいずれかで始まることを確認します。

58. **string**  
    - 文字列であることを確認します。

59. **timezone**  
    - 有効なタイムゾーンであることを確認します。

60. **unique:table,column**  
    - データベース内で一意であることを確認します。

61. **url**  
    - 有効なURLであることを確認します。

62. **uuid**  
    - 有効なUUIDであることを確認します。

## 参考

https://implist.dev/entries/laravel-basic-validation