如何在 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?
}

原文由 Svish 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 730
2 个回答

从 laravel 5.5 开始, ValidationException 类有一个静态方法 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']);

原文由 Erin 发布,翻译遵循 CC BY-SA 4.0 许可协议

在 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?']);

原文由 Hashim Aziz 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题