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

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

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

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

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

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

● よく使う 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」にも同じ値が入っているかチェック

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

・1. ユニーク

テーブル users の中に同じ email で登録がある場合はバリデーションエラーとする

'email' => 'unique:users

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

// 同じ shop_id の中で email はユニーク
$this->validation_column['email'] = \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です。コントローラーにバリデーションの記述が一切なくなりました。 コメントはどこかに記述しておくとよいでしょう。

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

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

@php
    dump( $errors );
@endphp
No.1485
06/13 10:00

edit