2016-04-08 2 views
4

Ich habe ein seltsames Problem in Bezug auf Validierungen in Laravel 5.2. Ich überprüfte folgende Fragen auf Stackoverflow, aber keiner von ihnen scheint zu meinem Fall anzuwenden:

Laravel validation not showing errors

Laravel Validation not returning error

Die Sache ist, dass ich versuche, ein title Feld zu validieren, bevor die Card persistierenden Objekt in die Datenbank einfügen. Wenn ich das Formular wie erwartet mit einem leeren title-Feld absende, besteht es die Validierungen nicht. Das Array $errors wird jedoch bei Versagen der genannten Validierungen nicht gefüllt. Kann mir jemand erklären, wo ich mit diesem Code falsch liege?

/////////////////////// CONTROLLER ///////////////////// 
public function create(Request $request) 
{ 
    $this->validate($request, [ 
     'title' => 'required|min:10' 
    ]); 

    Card::create($request->all()); 
    return back(); 
} 
///////////////////////// VIEW ///////////////////////// 
// Show errors, if any. (never gets triggered) 
@if(count($errors)) 
    <ul> 
     @foreach($errors->all() as $error) 
      <li>{{ $error }}</li> 
     @endforeach 
    </ul> 
@endif 
<form method="POST" action="/cards"> 
    {{ csrf_field() }} 

    <div class="form-group"> 
     // The textarea does not get populated with the 'old' value as well 
     <textarea class="form-control" name="title">{{ old('title') }}</textarea> 
    </div> 

    <div class="form-group"> 
     <button class="btn btn-primary" type="submit">Add Card</button> 
    </div> 
</form> 
+2

Können Sie fügen Sie Ihre 'routes.php' Datei sowie vollständige Controller-Datei? Irgendwie glaube ich, dass eine doppelte Umleitung stattfindet und Ihre '$ Fehler' nicht von einer Weiterleitung zur anderen übergehen. Oder, wenn Sie ruhige Routen verwenden, ist 'create' Methode nicht der Ort, um Ihre Speicherfunktion zu platzieren -' store' ist der Ort. –

+0

@ GiedriusKiršys Das Problem war in der Tat in der Routes-Datei, weil ich 'Web' Middleware-Gruppe zweimal (wie die angenommene Antwort wies). Danke für den Hinweis auf erholsame Routen, wird es im Hinterkopf behalten. –

Antwort

21

Wenn Sie Laravel 5.2.27 oder höher ausgeführt werden, müssen Sie nicht mehr die Gruppe Web-Middleware verwenden. Eigentlich sollten Sie es nicht zu Ihren Routen hinzufügen, da es jetzt automatisch automatisch angewendet wird.

Wenn Sie öffnen Sie Ihre app/Http/RouteServiceProvider.php Datei, werden Sie dieses Stück Code sehen:

protected function mapWebRoutes(Router $router) 
{ 
    $router->group([ 
     'namespace' => $this->namespace, 'middleware' => 'web', 
    ], function ($router) { 
     require app_path('Http/routes.php'); 
    }); 
} 

Quelle: https://github.com/laravel/laravel/blob/master/app/Providers/RouteServiceProvider.php#L53

Wie Sie sehen können, ist es die Web-Middleware automatisch für Sie ist die Anwendung. Wenn Sie versuchen, es erneut (mehr als einmal) in Ihrer routes-Datei anzuwenden, werden Sie auf seltsame Probleme stoßen, wie z.

Um die Version von Laravel, um herauszufinden, die ausgeführt wird, führen Sie diesen Befehl ein: php artisan --version

+2

Oh mein Gott! Ich hätte das ewig überlegt. Vielen Dank! –

+0

Kein Problem. :-) –

0

Ich denke, man die if-Klausel zu @if(count($errors) > 0)

+2

'@if (Anzahl ($ Fehler))' und '@if (Anzahl ($ Fehler)> 0)' sind gleich –

0

In Ihrem Controller eingestellt haben, versuchen, eine $validator->fails() Erklärung hinzu, und mit ->withErrors() Fehler zu Ihrer Vorlage zurückzukehren.

public function create(Request $request) 
{ 
    $validator = Validator::make($request->all(), [ 
     'title' => 'required|min:10' 
    ]); 

    if ($validator->fails()) { 
     return back()->withErrors($validator); 
    } 

    Card::create($request->all()); 
    return back(); 
} 
+0

Danke für eine Antwort. Ergebnis war das gleiche, aber die angenommene Antwort löste mein Problem –