Laravelのバリデーションで、独自のルールを設定する方法について書いています。
artisanコマンドでRuleファイルを作成することで、独自にバリデーションする項目に設定できます。
今回はLaravelのバージョン6で、挙動を確かめてみました。
独自のルールですが、例えば郵便番号のバリデーション(ハイフン付き)などをしたい場合に、Laravelにはこのルールが用意されていません。
この場合はRule
インターフェースを実装した、ZipCodeRuleというルールを作って下記のように指定すると良いです。
$request->validate([
'zip_code' => ['required', new ZipCodeRule()]
]);
それでは、実際にルールを作成する方法を見ていきましょう。
独自のRule(ルール)ファイルを作成する
下記のようにartisan
コマンドのmake:rule
を使用することによりファイルを作成できます。
$ php artisan make:rule [ルールファイルの名前]
今回は実際にZipCodeRuleを作ってみました。
$ php artisan make:rule ZipCodeRule
作成されたRule(ルール)ファイルの確認
Rule(ルール)ファイルはapp/Rule/
ディレクトリ配下に作成されます。
ファイルを開くと初期では、下記のような状態になっています。(コメントは省略しています)
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class ZipCodeRule implements Rule
{
public function __construct()
{
//
}
public function passes($attribute, $value)
{
//
}
public function message()
{
return 'The validation error message.';
}
}
作成したRule(ルール)ファイルを修正する
passes
メソッドに返り値がboolean(true / false)になるようにバリデーションを書きます。
message
メソッドはエラーだった場合のメッセージを書きます。
実際に郵便番号のルールを作ると、下記のような感じになりました。
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class ZipCodeRule implements Rule
{
public function __construct()
{
}
public function passes($attribute, $value)
{
return preg_match('/\A\d{3}[-]\d{4}\z/', $value);
}
public function message()
{
return '郵便番号が正しくありません。';
}
}
解説
passes
メソッドにルールを書きました。
preg_matchで郵便番号の000-0000
の形式にあっていた場合はtrueが返ります。(違う場合はfalse)
$value
変数にはバリデーションで指定した項目の値が入ってきます。
$attribute
変数にはフォームタグのname
で指定した属性が入ってきます。(name=”zip_code”の場合は”zip_code”が入っています)
基本的には$value
の方しか使わないかと思います。
message
メソッドには、エラー時のメッセージを記載しました。
今回は直接書きましたが、実際にプロジェクトで使用する場合はLangファサードを使うなどした方が良いです。
メッセージファイルにまとめておくことができます。
作成した独自のRule(ルール)を使用する
前回作ったフォームに郵便番号の項目を作成して、バリデーションしてみました。
ZipCodeRuleを使うためにuse
文で、App\Rules
の名前空間を指定します。
実際にコントローラーで書いたコードは下記のようになります。
<?php
namespace App\Http\Controllers;
use App\Rules\ZipCodeRule;
use Illuminate\Http\Request;
class TestController extends Controller
{
public function index()
{
return view('test');
}
public function testAction(Request $request)
{
$request->validate([
'user_name' => 'required',
'age' => 'required|integer|min:0',
'zip_code' => ['required', new ZipCodeRule()],
]);
}
}
解説
作成したApp\Rules\ZipCodeRule
をuse
文で指定します。
validateの左側はフォームの項目で、右側がルールでした。
独自で作成したルールはこのようにnew
して指定するといいです。
動作確認
下記のようにバリデーションにかかるように、郵便番号にハイフンを入れずに入力してみました。
エラーメッセージが表示されることが確認できました!(エラーがない場合も処理が通ることも確認しました)
終わりに
Laravelに用意されているルール以外でも、バリデーションしたいことも良く出てきます。
今回のようにRuleクラスを作ると簡単にできるので、使っていきましょう。
コメント