Laravel 資料驗證

一、基本驗證範例

use Illuminate\Support\Facades\Validator;

$validator = Validator::make(
    ['name' => 'Dayle'],
    ['name' => 'required|min:5']
);

使用陣列格式定義規則(推薦)

$validator = Validator::make(
    ['name' => 'Dayle'],
    ['name' => ['required', 'min:5']]
);

多欄位驗證

$validator = Validator::make(
    [
        'name' => 'Dayle',
        'password' => 'lamepassword',
        'email' => '[email protected]',
    ],
    [
        'name' => 'required',
        'password' => 'required|min:8',
        'email' => 'required|email|unique:users',
    ]
);

驗證結果判斷

if ($validator->fails()) {
    // 驗證失敗
}

// 取得失敗欄位與規則
$failed = $validator->failed();

// 取得錯誤訊息集合
$messages = $validator->messages();

二、控制器內使用 $request->validate()

public function store(Request $request)
{
    $validated = $request->validate([
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ]);

    // 資料通過驗證,可進一步處理
}

三、自訂 FormRequest 類別

php artisan make:request TestRequest

修改驗證請求類別

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class TestRequest extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'a' => 'required',
            'b' => 'email',
        ];
    }
}

在 Controller 中使用

use App\Http\Requests\TestRequest;

public function check(TestRequest $request)
{
    // 資料自動驗證,通過後才會進入此處
}

四、實例範例

路由設定

Route::post('application/check', [ApplicationController::class, 'check'])
    ->name('application.check');

表單驗證請求類別

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class ApplicationCheckRequest extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'name' => ['required', 'string', 'regex:/^[\p{Han}a-zA-Z\s]+$/u'],
            'birthday' => ['required', 'date_format:Y-m-d'],
            'identity_card' => ['required', 'string', 'regex:/^[A-Z]\d{9}$/'],
            'ethnic_group' => ['required', 'string', 'regex:/^[\p{Han}]{2,6}$/u'],
            'notes' => ['nullable', 'string', 'regex:/^[\p{Han}a-zA-Z0-9]+$/u'],
            'gender' => ['required', 'string', 'regex:/^[\p{Han}]{2}$/u'],
            'phone_type' => ['required', 'string', 'regex:/^[\p{Han}]{2}$/u'],
            'contact_number' => ['required', 'string', 'regex:/^09\d{8}$/'],
            'countyfirst' => ['required', 'string', 'regex:/^[\p{Han}]{3}$/u'],
            'districtfirst' => ['required', 'string', 'regex:/^[\p{Han}]{3,4}$/u'],
            'residence' => ['required', 'string', 'regex:/^[\p{Han}0-9a-zA-Z\s\-]+$/u'],
            'countysecond' => ['required', 'string', 'regex:/^[\p{Han}]{3}$/u'],
            'districtsecond' => ['required', 'string', 'regex:/^[\p{Han}]{3,4}$/u'],
            'placeOfResidence' => ['required', 'string', 'regex:/^[\p{Han}0-9a-zA-Z\s\-]+$/u'],
            'application_language' => ['required', 'string', 'regex:/^ethnic\-\d+$/'],
            'account' => ['required', 'string'],
        ];
    }
}

控制器方法

use App\Http\Requests\ApplicationCheckRequest;

public function check(ApplicationCheckRequest $request)
{
    $form = $request->validated();

    $exists = ApplicationForm::where('identity_card', $form['identity_card'])
        ->where('application_language', $form['application_language'])
        ->where('application_level', $form['application_level'])
        ->exists();

    $approved = ApplicationForm::where('identity_card', $form['identity_card'])
        ->where('application_language', $form['application_language'])
        ->where('application_level', $form['application_level'])
        ->where('application_status', 4)
        ->exists();

    $check = !$exists || $approved ? 0 : 1;

    $request->session()->put('application', $form);

    return response()->json(['check' => $check]);
}

五、Ajax 請求回傳 JSON 錯誤訊息

建立 Json 驗證基底類別

php artisan make:request ApiJsonRequest

編輯 ApiJsonRequest

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;

class ApiJsonRequest extends FormRequest
{
    protected function failedValidation(Validator $validator)
    {
        throw new HttpResponseException(
            response()->json([
                'errors' => $validator->errors(),
            ], 422)
        );
    }
}

使用方式:建立繼承類別

namespace App\Http\Requests;

class MyAjaxRequest extends ApiJsonRequest
{
    public function rules()
    {
        return [
            'name' => 'required|string',
            // ...
        ];
    }
}

如需官方文件參考,請見: