人気のPHP WEBアプリケーションフレームワークLaravelのTipsを記録していきます

Laravel で バリデーションを使用する

● Laravel で バリデーションを使用する

一番シンプルなやり方はコントローラーに次のように記述します

● 方法1. Laravel で シンプルなバリデーションをコントローラーに使用する

public function confirm( Request $request )
{
        $validation_rule = [
            "name_sei"           => 'required' ,
        ];
        // バリデーション(エラーがある場合は前の画面に戻ります)
        $this->validate( $request, $validation_rule );
}

● Laravel のバリデーションの記述方法には2種類あります

1. パイプでつなぐ記法

'item_id' => 'required|integer',

2. 配列記法 (正規表現で | を使用したい時はこちら。)

'item_id' => ['required', 'integer'] ,
'name'    => ['required','regex:{^[^/]+$}'] ,

● よく使う Laravel のバリデーション記述

'hogehoge_date'   => 'nullable|date',            		 // 日付( null を許す )
'hogehoge_id'     => 'nullable|integer',          		 // 数字( null を許す )
'hogehoge_tax_no' => 'required_if:withtax_flg,0', 		 // 条件( withtax_flg が 0 の時は hogehoge_tax_no 必須 )
'price_initial_no' => 'required_unless:mt_payment_id,21', // 条件( mt_payment_id が 21以外 の時は price_initial_no 必須 )
'email' => 'required|email|confirmed',        // 必須 , メールアドレス , 「email_confirmation」にも同じ値が入っているかチェック
'password' => 'nullable|confirmed',         // nullを許す, 「password_confirmation」にも同じ値が入っているかチェック
'name'    => ['required','regex:{^[^/]+$}'] , // 入力文字列にスラッシュを含めない

● すでにDBに登録ずみのメールアドレスを除外(ユニーク)

・1-1. ユニーク

テーブル users の中に同じ email で登録がある場合はバリデーションエラーとしたい、場合は次のように記述します

'email' => 'unique:users'

・1-2. ユニーク( update時)

↑ 上の記述は不完全で、データ更新(update)の時に自分自身のメールアドレスもエラーとしてしまいます。
そこで、自分自身は除外するように次のように記述します。

		// update時の validation
		$this->validation_column['email'] = [ 'required',
       	            \Illuminate\Validation\Rule::unique('admins')->ignore($id),
		];

・2. 条件付きユニーク( 同じ shop_id と email を持つものをバリデーションエラーとしたい )

// 同じ shop_id の中で email はユニーク
$this->validation_column['email'] = [ 'required', \Illuminate\Validation\Rule::unique('users')->where(function ($query) use ($q) {
										return $query->where('shop_id', $q['shop_id']);
								    }) ];
// validation
$this->validate($request, $this->validation_column);

● 方法2. Laravel で FormRequest を使用してバリデーションルールを記述する

独自のバリデーションルールを適用したい時バリデーションルールを動的に変更したいときなどは FormRequest を使用すると、バリデーション部分が外に出るのでコントローラーがすっきりします。

UsersRequest という フォームリクエストを作成します

php artisan make:request UsersRequest

app/Http/Requests/UsersRequest.php が自動作成されます。

例として shop_id と email をチェックしてユニークかどうかを判定するバリデーションを記述してみます

app/Http/Requests/UsersRequest.php

<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class UsersRequest extends FormRequest
{
    /**
     * 認証のロジックを記述する場合はここに記述する。
     * それ以外は常に true を返すように記述しておかないとバリデーションが動作しないので return true; とする。
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * バリデーションルールを記述
     *
     * @return array
     */
    public function rules()
    {
        return [
            "shop_id" => 'required' ,
            "email" => [ 'required', 'email', 'confirmed',
                        \Illuminate\Validation\Rule::unique('users')->ignore($this->input('id'))->where(function($query) {
                            // 入力されたshop_idの値と同じ値を持つレコードでのみ検証する
                            $query->where('shop_id', $this->input('shop_id'));
                        }),
            ] ,
        ];

    }
}

・コントローラーを次のように変更する

public function confirm( Request $request )
{
        $validation_rule = [
            "name_sei"           => 'required' ,
        ];
            // バリデーション(エラーがある場合は前の画面に戻ります)
            $this->validate( $request, $validation_rule );
}

  ↓

    /**
     * ユーザー登録確認
     *
     * \App\Http\Requests\UsersRequest による自動バリデーションが行われる(エラーの場合は前の画面に戻される)
     *
     */
    public function confirm( \App\Http\Requests\UsersRequest $request )
    {

これでOKです。コントローラーにバリデーションの記述が一切なくなりました。 コメントはどこかに記述しておくとよいでしょう。

● Blade内でバリデーションエラーを確認する

1. Bladeテンプレート内で確認する

@php
    dump( $errors );
@endphp

● Blade内でバリデーションエラーを表示する

emailパラメーターのエラーを表示させるには

@include('partial.error_message', ['param_name' => 'email'])

partial/error_message.blade.php

@if($errors->has($param_name))
    <div class="text-danger small" style="flex-wrap: wrap;">{{ $errors->first($param_name) }}</div>
@endif

● Bladeでバリデーションエラーで戻ってきた時に、入力済みの値をフォームに入れて表示する

old を使用します。

<input type="text" placeholder="" name="email" required value="{{ old('email') }}">
No.1485
08/21 12:23

edit