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

使用将 CSV 数据导入数据库的方法。我使用一些基本验证

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

但在那之后,事情可能会因为更复杂的原因而出错,进一步深入兔子洞,从而引发某种异常。我无法编写适当的验证内容来与此处的方法一起使用,但是,我真的很喜欢Laravel在验证失败时的工作方式,以及将错误嵌入到刀片视图中是多么容易,所以......validate

有没有一种(最好是干净的)方法来手动告诉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?
}

答案 1

从 laravel 5.5 开始,ValidationException 类有一个带有消息的静态方法,您可以使用它:

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

答案 2

Laravel < = 6.2 这个解决方案对我有用:

$validator = Validator::make([], []); // Empty data and rules fields
$validator->errors()->add('fieldName', 'This is the error message');
throw new ValidationException($validator);

推荐