如何在Laravel中手动返回或抛出验证错误/异常?
如何在Laravel中手动返回或抛出验证错误/异常?
有一个方法,用于将CSV数据导入数据库。我使用一个基本的验证方法,使用以下代码:\n
class CsvImportController extends Controller { public function import(Request $request) { $this->validate($request, [ 'csv_file' => 'required|mimes:csv,txt', ]);
\n但是在此之后,由于更复杂的原因,可能会出现问题,进一步深入到错误中,抛出某些异常。我不能编写适用于此处`validate`方法的正确验证内容,但是我真的很喜欢Laravel在验证失败时的工作方式,以及将错误嵌入到blade视图中的简便性,所以...\n有没有一种(最好是干净的)方法,能够手动告诉Laravel“我知道我现在没有使用你的`validate`方法,但我真的希望你能够像我使用了一样,在这里暴露这个错误”?有没有一些我可以返回的东西,或者我可以用它包装的异常?\n
try { // 调用一个深入错误的导入方法 } catch(\Exception $e) { // 我可以返回/抛出一些东西,对Laravel来说看起来像是验证错误,并在此处执行相应的操作吗? }
问题:如何在Laravel中手动返回或抛出验证错误/异常?
原因:在某些情况下,我们需要手动处理验证错误或异常,而不是通过自动验证。然而,Laravel默认情况下并没有提供直接手动返回或抛出验证错误的方法。
解决方法:通过以下步骤可以手动返回或抛出验证错误/异常。
1. 创建一个空的验证器:
$validator = \Validator::make([], []);
2. 添加字段和错误信息:
$validator->errors()->add('fieldName', 'This is the error message');
3. 抛出验证异常:
throw new \Illuminate\Validation\ValidationException($validator);
这种方法是Laravel核心代码库中官方使用的方法,可以有效地手动返回或抛出验证错误/异常。
问题的出现原因:在Laravel中,当需要手动返回或抛出验证错误/异常时,需要使用特定的方法来实现。这个问题的出现可能是因为开发者希望在控制器中手动处理验证错误,而不是依赖自动验证。
解决方法:下面是两种常用的手动返回或抛出验证错误/异常的方法。
方法一:通过在控制器中使用return back()->withErrors('your error message');
可以简单地返回错误信息。但是由于使用了back()
,表单中无法显示之前的值,即无法使用{{ old('fieldname') }}
来获取之前的表单值。如果需要显示之前的表单值,可以使用withInput()
方法,如return back()->withErrors('error')->withInput();
方法二:通过抛出ValidationException异常来返回错误信息。可以使用throw ValidationException::withMessages(['your error message']);
来抛出异常。这种方法也需要注意使用withInput()
来显示之前的表单值。
对于Laravel 8中的特定修复方法,可以使用->withErrors(['field' => 'Error message'])
来传递一个包含字段和错误信息的数组。
以上就是手动返回或抛出验证错误/异常的两种常用方法。
原因:在Laravel 5.5及以上版本中,需要手动返回或抛出验证错误/异常。可以使用ValidationException类的withMessages静态方法来实现。
解决方法:
1. 在代码中添加以下代码:
$error = \Illuminate\Validation\ValidationException::withMessages([ 'field_name_1' => ['Validation Message #1'], 'field_name_2' => ['Validation Message #2'], ]); throw $error;
2. 或者可以使用以下代码:
use Illuminate\Validation\ValidationException; throw ValidationException::withMessages(['field_name' => 'This value is incorrect']);
3. 还可以使用以下代码:
$error = ValidationException::withMessages([ "one_thing" => ["Validation Message #1"], "another_thing" => ['Validation Message #2'] ]);
4. Laravel 5.5版本以上的框架会将消息参数转换为数组,因此不需要传递二维数组,只需传递简单的键值对数组即可。
5. 如果要在手动抛出的ValidationException中传递其他异常消息,可以使用以下代码:
throw ValidationException::withMessages(array_merge($validator->getMessageBag()->getMessages(), ['other_key' => 'Other error message']));
6. 如果在控制器中使用了Validator门面类,并且出现了"Class 'App\Http\Controllers\Validator' not found"异常,需要导入命名空间。
7. Mārtiņš Briedis的答案也可以实现相同的功能,可能更加简洁。