本文目录导读:

在 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种临时验证器
这样可以根据不同的业务需求,选择最合适的验证分组方式。