LoginSignup
3
1

More than 1 year has passed since last update.

Spatie laravel-data ライブラリ バリデーションの設定

Last updated at Posted at 2022-05-25

概要

  • laravel-dataにてバリデーションを設定する方法をまとめる。

前提

方法

  • バリデーション設定方法は下記の三種類存在する。
    1. ライブラリが用意しているルール(属性)をアノテーションで設定
    2. Rule属性をアノテーションで記載して通常のformRequestと同じ記法で設定
    3. rules()関数でformRequestのように設定

ライブラリ用意の属性を使用

  1. 下記のようにリクエストクラスのコンストラクター引数にアノテーションでバリデーション属性を付与する。($nameの値を20最大20文字、$ageの値を最小1文字とするバリデーションを例に記載する。)

    app/Http/Requests/PostUserRequest.php
    <?php
    
    namespace App\Http\Requests;
    
    use Spatie\LaravelData\Data;
    use Spatie\LaravelData\Attributes\Validation\Max;
    use Spatie\LaravelData\Attributes\Validation\Min;
    
    class PostUserRequest extends Data
    {
        public function __construct(
            #[Max(20)]
            public string $name,
            #[Min(1)]
            public int $age
        )
        {
            
        }
    }
    
  2. ライブラリが用意してくれているバリデーション属性は下記ドキュメントにまとまっている。

Rule属性を使用

  1. 下記のようにリクエストクラスのコンストラクター引数にアノテーションでRule属性を付与する。

  2. カスタムバリデーションルールを使う事ができる。

  3. Rule属性の引数にformRequestと同じ方法でバリデーションルールを指定する。

    app/Http/Requests/PostUserRequest.php
    <?php
    
    namespace App\Http\Requests;
    
    use Spatie\LaravelData\Data;
    use Spatie\LaravelData\Attributes\Validation\Rule;
    
    class PostUserRequest extends Data
    {
        public function __construct(
            #[Rule(['required', max:20'])]
            public string $name,
            #[Rule(['required', 'min:1'])]
            public int $age
        )
        {
            
        }
    }
    
  4. ちなみにバリデーションルールは上記の配列での指定と下記2つの文字列での指定、引数での指定、それぞれに対応している。

  5. 文字列での指定

    app/Http/Requests/PostUserRequest.php
    <?php
    
    namespace App\Http\Requests;
    
    use Spatie\LaravelData\Data;
    use Spatie\LaravelData\Attributes\Validation\Rule;
    
    class PostUserRequest extends Data
    {
        public function __construct(
            #[Rule('required | max:20')]
            public string $name,
            #[Rule('required | min:1')]
            public int $age
        )
        {
            
        }
    }
    
  6. 引数での指定

    app/Http/Requests/PostUserRequest.php
    <?php
    
    namespace App\Http\Requests;
    
    use Spatie\LaravelData\Data;
    use Spatie\LaravelData\Attributes\Validation\Rule;
    
    class PostUserRequest extends Data
    {
        public function __construct(
            #[Rule('required', 'max:20']
            public string $name,
            #[Rule('required', 'min:1')]
            public int $age
        )
        {
            
        }
    }
    

rules()関数を使用

  1. 下記のようにリクエストクラスにrules()関数を定義することでバリデーションルールを定義することもできる。

    app/Http/Requests/PostUserRequest.php
    <?php
    
    namespace App\Http\Requests;
    
    use Spatie\LaravelData\Data;
    
    class PostUserRequest extends Data
    {
        public function __construct(
            public string $name,
            public int $age
        )
        {
        }
    
        public static function rules(): array
        {
            return [
                'name' => ['required', 'max:20'],
                'age' => ['required', 'min:1'],
            ];
        }
    }
    
  2. カスタムバリデーションルールを使う事ができる。

  3. 「Rule属性を使用」と同様にformRequestと同じ方法でバリデーションルールを指定する。

  4. 「Rule属性を使用」と「rules()関数を使用」は併用できるようだ。

  5. Illuminate\Validation\Rule::inなどのRuleクラスを用いてバリデーションをしたい場合はこの方法で記載すると良い。下記のバリデーションはageキーに紐づく値が18、19、20のいずれかであるかをバリデーションしている。

    app/Http/Requests/PostUserRequest.php
    <?php
    
    namespace App\Http\Requests;
    
    use Spatie\LaravelData\Data;
    use Illuminate\Validation\Rule;
    
    class PostUserRequest extends Data
    {
        public function __construct(
            public string $name,
            public int $age
        )
        {
        }
    
        public static function rules(): array
        {
            return [
                'name' => ['required', 'max:20'],
                'age' => ['required', Rule::in([18, 19, 20])],
            ];
        }
    }
    

参考文献

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1