wake-up-neo.com

Laravel Der Validator löst eine Ausnahme aus, anstatt ihn zurückzuleiten

Nach dem Upgrade auf Laravel 5.2 bin ich auf ein Problem mit dem Laravel-Validator gestoßen. Wenn ich Daten in einer Steuerung validieren möchte, nehme ich zum Beispiel diesen Code.

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class ContactController extends Controller
{
    public function storeContactRequest(Request $request)
    {
        $this->validate($request, [
            '_token' => 'required',
            'firstname' => 'required|string'
            'lastname' => 'required|string'
            'age' => 'required|integer',
            'message' => 'required|string'
        ]);

        // Here to store the message.
    }
}

Wenn ich jedoch nicht gültige Daten eingebe, leite ich mich nicht auf die vorherige Seite zurück und blende einige Meldungen zur Sitzung, aber es wird eine Ausnahme ausgelöst und eine 500-Fehlerseite angezeigt.

Dies ist die Ausnahme, die ich bekomme. Ich habe in der Dokumentation gelesen, dass die ValidationException anstelle der HttpResponseException neu ist, aber ich weiß nicht, ob sie damit etwas zu tun hat.

[2016-01-05 11:49:49] production.ERROR: exception 'Illuminate\Foundation\Validation\ValidationException' with message 'The given data failed to pass validation.' in /home/vagrant/Code/twentyre-webshop/vendor/laravel/framework/src/Illuminate/Foundation/Validation/ValidatesRequests.php:70

Und wenn ich eine separate Anforderungsklasse verwende, wird sie mit den Fehlernachrichten zurückgeleitet. Es scheint mir, dass nur die in einem Controller verwendete validate-Methode von diesem Verhalten betroffen ist.

11
DB93

Aktualisieren Sie Ihre App\Exceptions\Handler-Klasse

use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Illuminate\Foundation\Validation\ValidationException;

/**
 * A list of the exception types that should not be reported.
 *
 * @var array
 */
protected $dontReport = [
    AuthorizationException::class,
    HttpException::class,
    ModelNotFoundException::class,
    ValidationException::class,
];

Ich empfehle Ihnen auch, die Dokumente zu lesen, wie Sie auf Laravel 5.2 migrieren, da einige Änderungen vorgenommen wurden. Beispielsweise wirft ValidatesRequests die Eigenschaft Illuminate\Foundation\Validation\ValidationException anstelle von Illuminate\Http\Exception\HttpResponseException

Dokumentation zur Migration von Laravel 5.1 auf 5.2

5
xAoc

Beispiel aus laravel docs. Sie können die Validator-Fassade verwenden, da das Verhalten der benutzerdefinierten Validierung fehlschlägt

public function store(Request $request)
{
    $validator = Validator::make($request->all(), [
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ]);

    if ($validator->fails()) {
        return redirect('post/create')
                    ->withErrors($validator)
                    ->withInput();
    }

    // Store the blog post...
}
3
Nickstery

So gehe ich mit Laravel 5.3 um (durch Ändern von Handler.php)

https://stackoverflow.com/a/42852358/3107185

1
Rav

Für Laravel 5.2 musste ich folgende Zeile hinzufügen:

    if ($e instanceof ValidationException) 
    {
         return redirect()->back()->withInput();
    }

In App\Exceptions\Handler.php und den folgenden Kopfzeilen:

    use Illuminate\Session\TokenMismatchException;
    use Illuminate\Database\Eloquent\ModelNotFoundException;
    use Symfony\Component\HttpKernel\Exception\HttpException;
    use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
    use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
    use Illuminate\Validation\ValidationException;
    use Illuminate\Auth\AuthenticationException;
0
Eduardo Lemus

Für meinen Zweck buldete ich eine vollständig API-basierte Anwendung in Laravel 5.3 , die ich manuell von Laravel 5.1 aktualisiert hatte. und ich brauchte nur Laravel, um mit den Validierungsfehlern zu antworten, die bei FormRequest korrigiert werden mussten.

Hinzufügen dieser Zeile:

elseif ($e instanceof ValidationException) 
 {
        return $this->convertValidationExceptionToResponse($e, $request);
 }

nach diesem:

    if ($e instanceof ModelNotFoundException) {
        $e = new NotFoundHttpException($e->getMessage(), $e);
    }

In App\Exceptions\Handler.php hat ich den Trick gemacht und bei der FormRequest-Validierung erwartete Validierungsfehler zurückgegeben.

Bitte beachten Sie meine Kommentare hier: @ ratatatKEs Kommentare zu github

0
Moses Ndeda