web-dev-qa-db-ja.com

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?
}
36
Svish

laravel 5.5の時点で、 ValidationExceptionクラスには静的メソッドwithMessages があり、これを使用できます。

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

これはテストしていませんが、動作するはずです。

90
Erin

Laravel <= 5.8このソリューションは私のために働いた:

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

コントローラーから戻るだけです:

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

あなたはカスタムメッセージバッグを試すことができます

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

Laravel 5.8の場合:

例外をスローする最も簡単な方法は次のとおりです。

throw new \ErrorException('Error found');
0
Syamsoul Azrien

Laravel 5.4の場合:

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