Laravel 9 -即时自定义请求触发验证



我需要动态创建一个Laravel自定义请求。但是当我这样做时,验证立即被触发。我也不知道为什么。这是我的代码:

// this is in my ProjectController class. When a project gets created, i want the customer contact to be saved with it.
public function store(StoreProjectRequest $request)
{
//dd($request->only('contact')['contact']);
$storeContactReq = app()->make(AppHttpRequestsStoreContactRequest::class);
//the validation gets triggered right here, before i have the chance to add my request data
// even if i dd() here, i dont even reach this line of code
$storeContactReq->request->add($request->only('contact')['contact']); //yes this is correct
$storeContactReq->setMethod('POST');

$cc = new ContactController();
$con = $cc->store($storeContactReq);
dd($con);
//....
}

这是我的StoreContactRequest:

class StoreContactRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
//later
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, mixed>
*/
public function rules()
{
return [
"lastname" => 'required',
"firstname" => 'required',
"email" => 'required|email',
"phone" => 'required',
"street" => 'required',
"house" => 'required',
"postcode" => 'required',
"city" => 'required',
];
}
public function messages()
{
return [
'firstname.required' => 'Vorname ist leer',
'lastname.required' => 'Nachname ist leer',
'street.required' => 'Straße ist leer',
'house.required' => 'Hausnummer ist leer',
'postcode.required' => 'Postleitzahl ist leer',
'city.required' => 'Ort ist leer',
'phone.required' => 'Telefon ist leer',
'email.required' => 'Email ist leer',
'email.email' => 'Email ist keine korrekte Mailadresse'
];
}
public function failedValidation(Validator $validator)
{
dd($validator->errors());
}

错误信息:

IlluminateSupportMessageBag^ {#1359 // app/Http/Requests/StoreContactRequest.php:56
#messages: array:8 [
"lastname" => array:1 [
0 => "Nachname ist leer"
]
"firstname" => array:1 [
0 => "Vorname ist leer"
]
"email" => array:1 [
0 => "Email ist leer"
]
"phone" => array:1 [
0 => "Telefon ist leer"
]
"street" => array:1 [
0 => "Straße ist leer"
]
"house" => array:1 [
0 => "Hausnummer ist leer"
]
"postcode" => array:1 [
0 => "Postleitzahl ist leer"
]
"city" => array:1 [
0 => "Ort ist leer"
]
]
#format: ":message"
}

我在谷歌上搜索了很多,并查看了文档,但我就是找不到任何关于这个问题的信息…

我希望验证在ContactController::store()函数中触发,而不是当我手动创建StoreContactRequest和之前我可以添加任何数据到它....

thx

数据已经在请求中。您可以用Request验证它。如果有必要,您可以在StoreContactRequest rules()方法中手动添加自定义数据,甚至可以创建自定义验证规则:https://laravel.com/docs/9.x/validation#custom-validation-rules

我通过在store()方法中添加本地验证器来解决这个问题

$validator = Validator::make($request->all(), [
'lastname' => 'required',
'firstname' => 'required',
'email' => 'required|email',
'phone' => 'required',
'street' => 'required',
'house' => 'required',
'postcode' => 'required',
'city' => 'required',
]);
$validated = $validator->validate();
//$request->validate($request->all());
$con = Contact::create($validated);

这不是很方便,我想在这里会遇到问题,但现在它可以工作。谢谢所有的

您可以选择在StoreContactRequest类中实现prepareForValidation()方法,并且您可以为它添加额外的验证属性。请参阅https://laravel.com/docs/9.x/validation#preparing-input-for-validation。还可以随意重新定义failedValidation方法。https://github.com/laravel/framework/blob/9.x/src/Illuminate/Foundation/Http/FormRequest.php

最新更新