1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Laravel独自のバリデーションをつくる方法【個人的なお勉強アウトプット】

Last updated at Posted at 2022-03-25

参考図書

オリジナルのバリデータの作成にはいくつか方法がある。

  • Illuminate\Validation\Validatorクラスを継承したクラスを作成する方法(現在は非推奨のようです)
  • Validator::extendを使う方法
  • 独自のバリデーションルールをつくる

Illuminate\Validation\Validatorクラスを継承したクラスを作成する方法(現在は非推奨のようです)

use Illuminate\Validation\Validator;

class クラス名 extends Validator{
public function validate*** ($attribute, $value, $parameters){
...バリデーションの処理...
return 真偽値;
}
}

Validatorクラスを継承して作成。その中に「validate***」という名前のメソッドを用意。これがバリデーションで使われるルールとして認識される。
例えば「validateAbc」という名前でメソッドを用意すれば'abc'としてつくぁれる。

実例

バリデータクラスの作成

バリデータクラスはコードを生成するコマンドは用意されていない。作業でスクリプトファイルを用意する。

app/Http/Validators/HelloValidator.php
namespace App\Http\Validators;

use Illuminate\Validation\Validator;

class HelloValidator extends Validator{
public function validateHello($attribute, $value, $parameters){
return $value % 2 == 0;
}
}

HelloValidatorという名前で暮らすを作成。
偶数なら許可、奇数なら非許可となるバリデーションルール。

サービスプロバイダに組み込む

app/Providers/HelloServiceProvider.php
use Validator;
use App\Validators\HelloValidator;

public function boot(){
$validator = $this->app['validator'];
$validator->resolver(function($translator, $data, $rules, $messages){
return new HelloValidator($translator, $data, $rules, $messages);
})
}

バリデータは$this->app['validator']に保管されている。resolvverというメソッドでバリデーションの処理を粉う設定ができる。
クロージャでHelloValidatorクラスのインスタンスをreturnすることで設定できる。

HelloValidatorルールを利用

フォームリクエストのバリデーションルールを設定する箇所にHelloValidatorルールを設定する。
(多分からなずしもフォームリクエストじゃなくても大丈夫。)

app/Http/Requests/HelloRequest.php
public function rules(){
return [
'age' => 'numeric|hello'
]
}

コントローラでフォームリクエストを利用の設定

app/Http/Controllers/HelloController.php
public function post(HelloRequest $request){
return view('hello.index', ['msg'=>'正しく入力されました']);
}

Validator::extendを使う方法

上記のように独自のバリデータクラスを定義シて組み込むのはきちんとしたバリデータ処理を作成して汎用的に使えるようにする場合は有効。しかし、このフォームだけちょっとカスタマイズしたいルールを使いたい、という場合にextendを使うと簡単。

app/Providers/HelloServiceProvider.php
public function boot(){
Validator::extend('hello', function($attribute, $value, $parameters, $validator){
return $value % 2 == 0;
});
}

これで'hello'というルール名が追加される。
あとはフォームリクエストでルールを設定すればいいだけ。

独自のバリデーションルールをつくる

バリデータ自体の独自のルールをつくる方法
バリデーションルールはIlluminate\Contacts\Validation名前空間の「Rule」というクラスを継承して作られている。
この「Rule」を継承したクラスを用意すれば、そのクラスをバリデーションのルールとして使えるようになる。

バリデーションルールファイルの作り方

php artisan make:rule Myrule
appフォルダの中にRulesというフォルダが作成され、そのなかにMyrule.phpが作成される。

app/Rules/Myrule.php
<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class Myrule implements Rule
{

    public function __construct($n)
    {
        $this->num = $n;
    }

    public function passes($attribute, $value)
    {
        return $value % $this->num == 0;
    }

    public function message()
    {
        return $this->num . 'で割り切れる値が必要です。';
    }
}


指定した数値で割り切れるかどうか判定するバリデーション

Myruyleを使う

フォームリクエストのrulesメソッドに設定。

app/Http/Requests/HelloRequest.php
public function rules(){
return [
'age' => 'numeric|new Myrule(5)',
];
}

5で割り切れるかどうか判定できるようになる。

1
1
2

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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?