如何在 Laravel 手动返回或抛出验证错误/异常?

有一个将 CSV 数据导入数据库的方法

class CsvImportController extends Controller
{
public function import(Request $request)
{
$this->validate($request, [
'csv_file' => 'required|mimes:csv,txt',
]);

但在那之后,事情可能会因为更复杂的原因而出错,在更深的兔子洞里,抛出某种异常。我不能在这里用 validate方法编写合适的验证内容,但是,我真的很喜欢 Laravel 在验证失败时的工作方式,以及在刀片视图中嵌入错误是多么容易等等,所以..。

有没有一种(最好是干净的)方法来告诉 Laravel“我知道我现在没有使用你的 validate方法,但我真的希望你在这里暴露这个错误,就像我做的那样”?有没有什么东西我可以返回,一个例外,我可以包装的东西,或东西?

try
{
// Call the rabbit hole of an import method
}
catch(\Exception $e)
{
// Can I return/throw something that to Laravel looks
// like a validation error and acts accordingly here?
}
171161 次浏览

你可以试试定制的信息包

try
{
// Call the rabbit hole of an import method
}
catch(\Exception $e)
{
return redirect()->to('dashboard')->withErrors(new \Illuminate\Support\MessageBag(['catch_exception'=>$e->getMessage()]));
}

至于幼虫5.5,你可以使用的 类有一个静态方法 withMessages:

$error = \Illuminate\Validation\ValidationException::withMessages([
'field_name_1' => ['Validation Message #1'],
'field_name_2' => ['Validation Message #2'],
]);
throw $error;

我还没测试过,但应该能行。

更新

消息不必包装在数组中。您还可以这样做:

use Illuminate\Validation\ValidationException;


throw ValidationException::withMessages(['field_name' => 'This value is incorrect']);

Laravel < = 9. * 这个方法对我很有效:

// Empty data and rules
$validator = \Validator::make([], []);


// Add fields and errors
$validator->errors()->add('fieldName', 'This is the error message');


throw new \Illuminate\Validation\ValidationException($validator);

只需从控制器返回:

return back()->withErrors('your error message');

或:

throw ValidationException::withMessages(['your error message']);

对于 Laravel 5.8:

.

抛出异常的最简单方法如下:

throw new \ErrorException('Error found');

Laravel 5.5 > 开始你可以使用

如果给定的布尔表达式计算结果为 true,则抛出给定的异常

$foo = true;
throw_if($foo, \Exception::class, 'The foo is true!');

或者

如果给定的布尔表达式计算结果为 false,则抛出给定的异常

$foo = false;
throw_unless($foo);

看这里

在 Laravel 8及以上版本中,下面的代码同时适用于控制器和模型:

return back()->withErrors(["email" => "Are you sure the email is correct?"])->withInput();

这将使用户返回到他们之前所在的视图,显示指定字段的指定错误(如果存在) ,并用用户刚刚输入的信息重新填充所有字段,允许他们简单地调整不正确的字段,而不是再次填写整个表单。

另一个功能类似的替代方案是这样做:

throw ValidationException::withMessages(['email' => 'Are you sure the email is correct?']);