人気の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_time'   => 'date_format:H:i',            		 // 時間( 12:40 や 07:05 などのフォーマット)
// regex を使用する時は array() を使用しましょう。 | が正規表現の文字として使えるようになります。
'hogehoge_time2'   => array( 'regex:{((0?[0-9])|(1[0-9])|(2[0-9])|(3[0-9])|(4[0-9])|(5[0-9]))}' ) ,  // 分( 00 〜 59 または 0 〜 59  )
'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 必須 )
'grade_no'      => 'required_with:school_id',  // 条件( school_id に値がある時 grade_no 必須。条件となるカラムはカンマ区切りで複数指定可 )
'send_flg'         => 'integer|in:0,1' , //  0 または 1 の数値
'year_month_name'          => ['required','regex:{^[0-9]+/[0-9]+$}'] ,  // 正規表現 2019/12 のような表記にマッチするか?
'email' => 'required|email|confirmed',        // 必須 , メールアドレス , 「email_confirmation」にも同じ値が入っているかチェック
'password' => 'nullable|confirmed',         // nullを許す, 「password_confirmation」にも同じ値が入っているかチェック
'name'    => ['required','regex:{^[^/]+$}'] , // 入力文字列にスラッシュを含めない
'password'      => 'required|min:4',        // 4文字以上

● 全ての checkbox にチェックが入っていることを確認する

// rule
$validation_rule['confirmations'] =  [ 'required', function($attribute, $value, $fail) use ($confirmations_count) {
    if ( $confirmations_count !== count($value) ){
        return $fail('確認事項全てにチェックをつけてください');
    }
  }
];

// message
$validation_message = [
    'confirmations.required' => '確認事項にチェックをつけてください',
];  

チェックが一つも入っていない時は required のエラー「確認事項にチェックをつけてください」が表示されます
全てにチェックが入っていない時は クロージャー のエラー「確認事項全てにチェックをつけてください」が表示されます

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

・1-1. ユニーク

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

'email' => 'unique:users'

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

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

		// update時の validation
		$this->validation_column['email'] = [ 'required',
       	            \Illuminate\Validation\Rule::unique('users')->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']);
}) ];
// バリデーション実行
$this->validate($request, $this->validation_column);

● すでにDBに登録ずみのメールアドレスを除外を insert,update 時のvalidationをまとめて記述する

次のように記述すると新規登録時と更新時の 登録ずみのメールアドレス除外 バリデーションをまとめて登録することができます。

// 事前にモデルの $id を取得しておきます。
$id = xxxxxxxxxxxxxxxxxx;

$this->validation_column = [
	'email'    => 'required|email|unique:users,email' . ($id > 0 ? ",{$id}" : ''),
	'password' => ($id > 0 ? '' : 'required|') . 'min:4|confirmed',
];

● 方法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'])

Bootstrapの場合

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

Tailwind CSSの場合

@error('email')
    <div class="text-red-500 text-xs absolute mt-1">{{ $message }}</div>
@enderror

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

old を使用します。

<input type="text" placeholder="" name="email" required value="{{ old('email') }}">

https://twitter.com/juandmegon/status/1274134701800919040?s=21

● 全角変換などバリデーションまえの処理を行う

use Illuminate\Support\Str;

/**
 * バリーデーションのためにデータを準備
 *
 * @return void
 */
protected function prepareForValidation()
{
    $this->merge([
        'slug' => Str::slug($this->slug),
    ]);
}

● バリデーションのエラーメッセージを日本語化する

https://pgmemo.tokyo/data/archives/1952.html

● バリデーションのカスタムエラーメッセージを表示する

$validation_rule = [
    'last_name'       => 'required',
];

$validation_message = [
    'last_name.required' => '名前は必ず入力してください',
];

$this->validate( $request, $validation_rule, $validation_message );
No.1485
04/01 17:11

edit