Laravel验证分组怎么实现

wen PHP项目 2

本文目录导读:

Laravel验证分组怎么实现

  1. 使用数组定义验证规则(最常用)
  2. 使用 Form Request 分组验证
  3. 使用分批验证
  4. 使用验证规则对象
  5. 使用临时验证器
  6. 推荐的最佳实践

在 Laravel 中,验证分组有多种实现方式,以下是几种常见的方法:

使用数组定义验证规则(最常用)

public function store(Request $request)
{
    $validatedData = $request->validate([
        'user' => 'required|array',
        'user.name' => 'required|string|max:255',
        'user.email' => 'required|email|unique:users,email',
        'user.password' => 'required|min:8',
        'address' => 'required|array',
        'address.street' => 'required|string',
        'address.city' => 'required|string',
        'address.zip' => 'required|string|size:6',
    ]);
}

使用 Form Request 分组验证

创建 Form Request

php artisan make:request StoreUserRequest
php artisan make:request StoreAddressRequest

验证规则

// app/Http/Requests/StoreUserRequest.php
public function rules()
{
    return [
        'name' => 'required|string|max:255',
        'email' => 'required|email|unique:users,email',
        'password' => 'required|min:8|confirmed',
    ];
}
// app/Http/Requests/StoreAddressRequest.php
public function rules()
{
    return [
        'street' => 'required|string',
        'city' => 'required|string',
        'state' => 'required|string|size:2',
        'zip' => 'required|string|size:6',
    ];
}

在控制器中使用

public function store(StoreUserRequest $userRequest, StoreAddressRequest $addressRequest)
{
    // 两个验证都通过后,获取数据
    $userData = $userRequest->validated();
    $addressData = $addressRequest->validated();
    // 业务逻辑...
}

使用分批验证

public function store(Request $request)
{
    // 验证用户部分
    $userRules = [
        'user.name' => 'required|string|max:255',
        'user.email' => 'required|email|unique:users,email',
        'user.password' => 'required|min:8',
    ];
    $userValidator = Validator::make($request->all(), $userRules);
    if ($userValidator->fails()) {
        return redirect()->back()
            ->withErrors($userValidator)
            ->withInput();
    }
    // 验证地址部分
    $addressRules = [
        'address.street' => 'required|string',
        'address.city' => 'required|string',
        'address.zip' => 'required|string|size:6',
    ];
    $addressValidator = Validator::make($request->all(), $addressRules);
    if ($addressValidator->fails()) {
        return redirect()->back()
            ->withErrors($addressValidator)
            ->withInput();
    }
    // 全部验证通过,处理数据
}

使用验证规则对象

创建规则对象

php artisan make:rule UserValidationRules
php artisan make:rule AddressValidationRules

定义规则

// app/Rules/UserValidationRules.php
class UserValidationRules
{
    public static function rules(): array
    {
        return [
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:users,email',
            'password' => 'required|min:8',
        ];
    }
}
// app/Rules/AddressValidationRules.php
class AddressValidationRules
{
    public static function rules(): array
    {
        return [
            'street' => 'required|string',
            'city' => 'required|string',
            'state' => 'required|string|size:2',
            'zip' => 'required|string|size:6',
        ];
    }
}

使用

use App\Rules\UserValidationRules;
use App\Rules\AddressValidationRules;
public function store(Request $request)
{
    $rules = array_merge(
        ['user.*' => UserValidationRules::rules()],
        ['address.*' => AddressValidationRules::rules()]
    );
    $validatedData = $request->validate($rules);
}

使用临时验证器

use Illuminate\Support\Facades\Validator;
public function customGroupValidation(Request $request)
{
    $validator = Validator::make($request->all(), [
        'user' => 'required|array',
        'address' => 'required|array',
    ]);
    $validator->sometimes('user.email', 'unique:users,email', function ($input) {
        return !empty($input->user) && !empty($input->user['email']);
    });
    $validator->sometimes('address.zip', 'size:6', function ($input) {
        return !empty($input->address) && $input->address['country'] === 'CHINA';
    });
    if ($validator->fails()) {
        return redirect()->back()
            ->withErrors($validator)
            ->withInput();
    }
    // 处理数据...
}

推荐的最佳实践

使用验证器类 + 条件验证

<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class RegistrationRequest extends FormRequest
{
    public function authorize()
    {
        return true;
    }
    public function rules()
    {
        return [
            // 个人基本信息
            'personal_info' => 'required|array',
            'personal_info.first_name' => 'required|string|max:50',
            'personal_info.last_name' => 'required|string|max:50',
            'personal_info.birth_date' => 'required|date|before:today',
            // 账户信息
            'account_info' => 'required|array',
            'account_info.email' => 'required|email|unique:users,email',
            'account_info.password' => [
                'required',
                'string',
                'min:8',
                'regex:/[a-z]/',      // 必须包含小写字母
                'regex:/[A-Z]/',      // 必须包含大写字母
                'regex:/[0-9]/',      // 必须包含数字
                'confirmed',
            ],
            // 联系信息
            'contact_info' => 'required|array',
            'contact_info.phone' => 'required|regex:/^([0-9\s\-\+\(\)]*)$/|min:10',
            'contact_info.address.street' => 'required|string',
            'contact_info.address.city' => 'required|string',
            'contact_info.address.state' => 'required|string|size:2',
            'contact_info.address.zip' => 'required|string|size:6',
        ];
    }
    public function messages()
    {
        return [
            'personal_info.*.required' => '个人基本信息是必填的。',
            'account_info.email.unique' => '该邮箱已被注册。',
            'account_info.password.regex' => '密码需要包含大小写字母和数字。',
            'contact_info.*.required' => '联系信息是必填的。',
        ];
    }
}

选择建议:

  • 小型项目:使用第1种数组验证
  • 中型项目:使用第2种 Form Request
  • 复杂业务:使用第4种规则对象或第6种自定义验证器
  • 条件验证:使用第5种临时验证器

这样可以根据不同的业务需求,选择最合适的验证分组方式。

上一篇PHP验证错误消息怎么本地化

下一篇当前分类已是最新一篇

抱歉,评论功能暂时关闭!