本文目录导读:

在 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种临时验证器
这样可以根据不同的业务需求,选择最合适的验证分组方式。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播