2016-07-13 6 views
1

Also ich stieß auf ein Problem, das ich nicht genau lösen konnte und keine Ahnung, wo ich damit anfangen sollte.Laravel benutzerdefinierte Fehler mit Modell in den Controller

Ich weiß, Laravel hat eine nette findOrFail() Funktion, aber ich scheine nicht in der Lage, das in meinem Fall zu verwenden. So zum Beispiel habe ich eine Route wie folgt:

Route::get('user/{user}', '[email protected]); 

Mein Controller

public function show(User $user) 
{ 
    //never reaches this section 
} 

Nun würde dies in der Regel arbeiten, aber wenn der Datensatz existiert nicht Laravel den Fehler wirft, bevor ich in der Funktion erhalten. Gibt es eine schöne und einfache Möglichkeit, den Fehler zu fangen, ohne meine Funktion

Wechsel
public function show($id) 
{ 
    $user = User::findOrFail($id) 
} 

ich es viel schöner finde die Benutzerklasse in meiner Funktion Parametern haben, und will nicht, dass es dort zu entfernen.

Antwort

2

Per the Laravel Docs for Route Model Binding (nach unten scrollen, um das ‚Anpassen des‚Not Found‘Verhalten‘ Überschrift):

Wenn Sie Ihr eigenes „nicht gefunden“ Verhalten angeben, übergeben Sie ein Closure als drittes Argument an die model Methode:

$router->model('user', 'App\User', function() { 
    throw new NotFoundHttpException; 
}); 

Früher geben sie, wo dieser Code zu platzieren:

Sie sollten Ihre Modellbindungen in der RouteServiceProvider::boot Methode definieren.

+1

Wie blöd das ich das vermisst habe, vielen Dank das es mein Problem gelöst hat! – killstreet

0

Zum ersten Mal eine Frage zu beantworten, also ertragen Sie mit mir!

Sie können einen PHP try/catch-Block verwenden. So etwas wie folgt aus:

try { 
     //Your code here 
    } catch (\Exception $e) { 
     return \Redirect::to('/users') 
      ->with('error', 1) 
      ->with('message', 'Error getting your record!'); 
    } 

Und dann in Ihrem Laravel Klinge Sie können wie etwas tun:

@if(!empty($error) && $error == 1) 
    <div> 
     <strong>Uh-Oh!</strong> 
     @if(!empty($message)) 
      {!! $message !!} 
     @endif 
    </div> 
@endif 

den Fehler anzuzeigen. Sie können auch auf eine gewünschte Fehlerseite umleiten.

+1

Das Problem ist, dass der Fehler angezeigt wird, bevor ich etwas in meiner Funktion tun kann. Selbst wenn ich Echo "test" setze; sterben; In meiner Funktion wird dies nicht angezeigt. – killstreet

+0

Nun, wenn Ihr Code nicht zu Ihrer Funktion kommt, bedeutet das, dass es vorher ein Problem gibt! Ihre Route ist ein GET mit einem URL-Parameter der Benutzer-ID. Also sollte Ihre Funktion 'public function show ($ userid)' in der ersten Zeile lesen. Wenn Sie danach fragen, können Sie etwas wie '$ user = User :: find ($ userid)' machen. Dann können Sie etwas tun wie 'if ($ user) {// code} else {// zu Benutzern mit Fehler zurückkehren}' – user3776578

+0

Ab Laravel 5 können Sie auch wie 'app() -> make (\ App \ Models \ User :: class) -> wo ('users.id', '=', $ userid) -> get(); 'was sauberer ist, denke ich, du musst deine Models nicht spritzen. – user3776578