Haben Sie eine Methode, die CSV-Daten in eine Datenbank importiert. Ich mache eine grundlegende Validierung mit
class CsvImportController extends Controller
{
public function import(Request $request)
{
$this->validate($request, [
'csv_file' => 'required|mimes:csv,txt',
]);
Aber danach können Dinge aus komplexeren Gründen schief gehen, weiter unten im Kaninchenbau, was zu Ausnahmen führt. Ich kann hier kein richtiges Validierungsmaterial für die validate
Methode schreiben , aber ich mag es wirklich, wie Laravel funktioniert, wenn die Validierung fehlschlägt und wie einfach es ist, die Fehler in die Blade-Ansicht usw. einzubetten, also ...
Gibt es eine (vorzugsweise saubere) Möglichkeit , Laravel manuell mitzuteilen, dass "Ich weiß, dass ich Ihre validate
Methode gerade nicht angewendet habe, aber ich möchte wirklich, dass Sie diesen Fehler hier aufdecken, als ob ich es getan hätte"? Gibt es etwas, das ich zurückgeben kann, eine Ausnahme, mit der ich Dinge einpacken kann, oder etwas?
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?
}
Validator::extend('foo', function ($attribute, $value, $parameters, $validator) { return $value == 'foo'; });
hinzuzufügen ? Dann können Sie die Foo-Regel in die Regeln aufnehmen'csv_file' => 'required|foo|mimes:csv,txt',
?try { //my stuff } catch (Exception $ex) { echo $ex->getMessage(); //Message //$ex->getFile(); //File //$ex->getLine(); //Line }
try { $validator = Validator::make($request, ['csv_file' => 'required|mimes:csv,txt']); if ($validator->fails()) { throw new Exception(implode('<br>', $validator->errors()->all()), 999); } } catch (Exception $ex) { if ($ex->getCode() == 999) { //this is a custom error } echo $ex->getMessage(); //Message }
Antworten:
Ab Laravel 5.5 verfügt die
ValidationException
Klasse über eine statische MethodewithMessages
, die Sie verwenden können:$error = \Illuminate\Validation\ValidationException::withMessages([ 'field_name_1' => ['Validation Message #1'], 'field_name_2' => ['Validation Message #2'], ]); throw $error;
Ich habe das nicht getestet, aber es sollte funktionieren.
Aktualisieren
Die Nachricht muss nicht in ein Array eingeschlossen werden. Sie können auch tun:
use Illuminate\Validation\ValidationException; throw ValidationException::withMessages(['field_name' => 'This value is incorrect']);
quelle
$error = ValidationException::withMessages([ "one_thing" => ["Validation Message #1"], "another_thing" => ['Validation Message #2'] ]);
Laravel <= 6.2 Diese Lösung hat bei mir funktioniert:
$validator = Validator::make([], []); // Empty data and rules fields $validator->errors()->add('fieldName', 'This is the error message'); throw new ValidationException($validator);
quelle
Einfach vom Controller zurückkehren:
return back()->withErrors('your error message');
quelle
withInput()
Sie können eine benutzerdefinierte Nachrichtentasche ausprobieren
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()])); }
quelle
MessageBag
scheint keine Ausnahmen zu mögen? Das Aufrufen mitnew MessageBag(['exception' => $e])
führt zu einem leeren Fehlersatz, währendnew MessageBag(['exception' => $e->getMessage()])
dies nicht der Fall ist ... 🤔Für Laravel 5.8:
.
Der einfachste Weg, eine Ausnahme auszulösen, ist folgender:
throw new \ErrorException('Error found');
quelle