【Laravel】オリジナルバリデーションルールの作り方!make:ruleコマンド
この記事からわかること
- Laravelでオリジナルバリデーションルールの作り方
- make:ruleコマンドの詳細の作成されるファイル解説
- エラーメッセージやルールのカスタマイズ
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
Laravelでオリジナルのバリデーションルールを作る方法と組み込み方をまとめていきたいと思います。
オリジナルバリデーションルールの作り方
独自のバリデーションルールを定義するにはLaravelに用意されているmake:rule
コマンドを使用します。
$ php artisan make:rule TestOriginalRule
これで「app」>「Rules」の中に指定したファイル名(今回はTestOriginalRule)のスクリプトファイルが自動生成されます。ファイルの中は以下のようにクラスが定義されています。
TestOriginalRule.php
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class TestOriginalRule implements Rule
{
public function __construct()
{
//
}
public function passes($attribute, $value)
{
//
}
public function message()
{
return 'The validation error message.';
}
}
ルールクラスの各メソッドの意味
作成されたクラスは名前空間Illuminate\Contracts\Validation\Rule
を継承したルールクラスになっており3つのメソッドがデフォルトで記述されています。
- __construct:初期化処理(変数に格納など)
- passesメソッド:バリデーションルール(判定部分)
- messageメソッド:エラー時のメッセージ
__construct
__construct
はphpのクラス構造自体に元々定義されているインスタンス化した時に自動実行される処理を記述できるメソッドです。クラスのプロパティ(変数)に値を渡すなどインスタンス化時に初期化するための処理などして使用します。
バリデーションルール作成に重要なのはpasses
メソッドとmessage
メソッドです。
passesメソッドの役割
public function passes($attribute, $value)
{
return 真偽値を返す;
}
passes
メソッドはバリデーションルールのエラー判定を行うメソッドです。最終的に返す値でエラー判定を行い、true
にすれば合格、false
にすればエラーとしてはねることができます。
引数にはルール関係の設定属性を受け取る$attribute
と実際に検証する値を受け取る$value
が渡されます。
messageメソッド
public function message()
{
return 'これはエラーメッセージです。';
}
message
メソッドはxエラーとして弾いた時に出せるメッセージを定義Yesできるメソッドです。
メッセージの中に:attribute
と組み込むと自動で指定したname
属性の値へと置換されます。
return ':attribute項目では許可されていません';
独自ルールを使用する
独自ルールを実際に使用するには使用するファイルでuse
文を使ってルールクラスを読み込みます。
use App\Rules\TestOriginalRule;
続いてルールを作成する配列の中で適応させたいルールクラスをインスタンス化するだけです。これでオリジナルルールを使ったバリデーションができるようになります。
$request->validate([
'name' => ['required', 'string', new TestOriginalRule],
]);
インスタンス化時に引数を渡す
ルールクラスを動的に変化させるために引数から値を渡すことも可能です。その際はルールクラスのコンストラクタを使用しクラスのプロパティへと値を渡します。
例として「引数に渡された文字位置の値が.(ドット)のみ許容」という独自ルールを作成してみます。
作成コマンド
$ php artisan make:rule PosOnlyDot
PosOnlyDot.php
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class PosOnlyDot implements Rule
{
public function __construct(int $num)
{
// インスタンス化時に渡された引数をプロパティに紐づける
$this->num = $num;
}
public function passes($attribute, $value)
{
$pos = strpos($value, ".");
if ($pos == $this->num) {
return true;
} else {
return false;
}
}
public function message()
{
return $this->num . '番目にはドットが来るように入力してください。';
}
}
コンストラクタでプロパティに格納すれば他のメソッドの中からでもその値に参照することが可能になるのでその値による分岐や取得ができるようになります。
あとは通常のバリデーションルール同様に組み込むだけです。|
区切りのルール定義ではなく、以下のような配列形式で独自ルールは渡します。
Controller.phpなど
use App\Rules\PosOnlyDot;
$request->validate([
'name' => ['required', new PosOnlyDot(6)],
]);
おすすめ記事:【まとめ】Laravel-バリデーションルール一覧
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。