バリデーション

Tag:

Laravelでバリデーションを設定する方法について取り上げます。

Controllerのvalidateメソッドでバリデーションを設定

App\Http\Controllers\Controllerクラスで、ValidatesRequestsトレイトを取り込んでいます。このValidatesRequestsトレイト内のvalidateメソッドを利用してバリデーションを設定できます。

class XxxController extends Controller
{
    public function store(Request $request)
    {
        $this->validate($request, [
            'name' => 'required',
            'old' => 'required|max:120|integer'
        ]);
    }
}

バリデーション失敗時

バリデーションに失敗すると例外が発生します。

HTTPリクエストの場合
以前のページにリダイレクトします。このときバリデーションエラー内容はフラッシュデータとして保存されます。リダイレクトで以前のページにアクセスした際に、$errors変数を通じて保存されたエラー内容にアクセスできます。

AJAXリクエストの場合
422HTTPステータスコードでJSONレスポンスが送られます。

View上でエラー内容と直前入力データにアクセス

oldヘルパー関数を通じて、直前入力データにアクセスできます。
$errors変数を通じて、バリデーションエラーにアクセスできます。

<input type="text" name="name" value="{{ old('name', $userdata->name) }}">

@if ($errors->has('name'))
<span class="text-danger">
    <strong>{{ $errors->first('name') }}</strong>
</span>
@endif
1行目
oldヘルパー関数の第2引数には、直前入力データが設定されてないときの値を設定できます。
3~7行目
エラーが設定されていれば、エラーメッセージを表示してます。

エラーメッセージの指定

言語ファイルで指定可能です。日本語であれば、「resources/lang/ja/validation.php」で調整します。

下記内容を調整できます。

  • ルールごとのバリデーションメッセージ
  • 「特定属性」の「特定ルール」にだけ指定するバリデーションメッセージ(custom配列で指定)
  • 属性の日本表示(attributes配列で指定)

属性の日本語表示での注意

formのname属性に指定する名称をDB上のカラム名と同一名称にすることが多いかと思います。

例えば、「usersテーブルのnameカラム」と「productsテーブルのnameカラム」で両方ともformのname属性に「name」と指定し、「resources/lang/ja/validation.php」内のattributes配列に次のように指定しているとします。

    'attributes' => [
        'name' => 'ユーザー名',
    ],

すると、「productsテーブルのnameカラム」でもバリデーションメッセージとして「ユーザー名は必ず指定してください」と表示されてしまいます。

なので、下記のようにattributes配列を設定し、formのname属性も「user_name」「product_name」と区分けするなどの考慮が必要です。

    'attributes' => [
        'user_name' => 'ユーザー名',
        'product_name' => '商品名',
    ],

バリデーションの指定

主なバリデーションの指定方法について取り上げます。

ルール 概要
required 入力必須
integer 整数値(-2や3。1ずつきざむ値)であること
numeric 数値(小数なども含む)であること
email メールアドレスの形式であること
url urlの形式であること
image ファイルが画像(jpg、png、bmp、gif、svg)であること
mimes:jpeg,png,gif ファイル形式が指定形式のどれかと一致すること
date 日付であること
before:日付
after:日付
指定した日付以前/以降であること。日付には、日付文字列(tomorrowなど)を利用できます。日付文字列については、「PHP : 日付操作 | DN-Web64」内で取り上げています。
max:値
min:値
指定された値以上/以下であること。文字列、数値、ファイルで利用可能。
between:min,max 指定された最小値と最大値の間のサイズであること
in:foo,bar fooまたは、barであること。マルチバイト文字列では利用しない。
accepted yes、on、1、trueであること。利用規約同意などで利用。
unique:users,email 「usersテーブル」の「emailカラムのデータ」に同一値がないこと
confirmed パスワード入力確認フォームに対して利用。
regex:正規表現 指定された正規表現にマッチすること。正規表現にパイプ(|)を含む場合、パイプ区切りでルールを指定する方法ではなく、配列でルールを指定すること。

$word = array('英語', '国語', '算数');

// 下記指定は、NG
$this->validate($request, [
    'word' => 'string|regex:/^' . implode("|", $word) . '$/'
]);

// 次のように配列で指定する。
$this->validate($request, [
    'word' => ['string', 'regex:/^' . implode("|", $word) . '$/']
]);
alpha_num 注意が必要。ルールとしては、全部アルファベット文字と数字であることだが、マルチバイト文字も受け付けてしまう。半角英数を指定したいとき、下記のように正規表現を利用する。

regex:/^[a-zA-Z0-9]+$/

新たに、上記正規表現で判定するカスタムバリデーションを追加して利用するのも良いかと思います。

その他のルールや詳しい説明は、下記URLが参考になります。
⇒ https://readouble.com/laravel/5.1/ja/validation.html#available-validation-rules

スポンサーリンク