2016-07-27 16 views
2

Um explizit einen Parameter zu einem Modell zu binden und werfen eine benutzerdefinierte Ausnahme Ich habe (unter anderem) folgende Unterlagen an das RouteServiceProvider hinzufügen: (Explicit Binding) Anpassen der Resolution Logic & Customizing Die „Not Found“ Verhalten

$router->model('parameter', 'App\Model', function() { 
    throw new CustomNotFoundException; 
}); 

um die Auflösung Logik der expliziten Bindung anpassen ich folgendes zum RouteServiceProvider hinzufügen:

$router->bind('parameter', function ($parameter) { 
    return App\Model::where('field', $parameter)->first(); 
}); 

Mein Problem ist, dass ich beide brauchen aber anscheinend nicht. Wenn ich den Parameter an das Modell anbinde und auch die Auflösungslogik anpasse, wirft er nicht meine CustomNotFoundException, stattdessen wird der Standardwert ModelNotFoundException geworfen.

Um mein Ziel klar zusammenzufassen: Ich möchte die Auflösungslogik anpassen und eine benutzerdefinierte Ausnahme auslösen, wenn es keinen Datensatz findet.

EDIT ich dies nach einem Vorschlag von @Maraboc versucht:

$router->bind('parameter', function ($parameter) { 
    try { 
     return App\Model::where('field' => $parameter)->first(); 
    } catch (Exception $e) { 
     throw new CustomNotFoundException; 
    } 
}); 

Das wird noch ein ModelNotFoundException aus einem Grunde wirft ich nicht bewusst bin.

+0

Versuchen Sie, 'App \ Model :: wo ('Feld', $ -Parameter) -> first();' mit try catch zu fangen 'ModelNotFoundException' und werfen Sie stattdessen Ihre' CustomNotFoundException' statt – Maraboc

+0

@Maraboc Ich habe es versucht, aber es ist funktioniert nicht, vielleicht habe ich etwas falsch gemacht. Bitte überprüfe die Änderung, die ich gerade am OP gemacht habe. Vielen Dank! – RektByAyyLMAO

Antwort

1

Probieren Sie es wie folgt aus:

$router->bind('parameter', function ($parameter) { 
    try { 
     return App\Model::where('field' => $parameter)->firstOrFail(); 
    } catch (ModelNotFoundException $e) { 
     throw new CustomNotFoundException; 
    } 
}); 

OR in der App\Exceptions\Handler dies dem Verfahren render hinzufügen:

if ($e instanceof ModelNotFoundException) { 
    throw new CustomNotFoundException; 
} 

Und use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundException;

oder eine andere Abhilfe ist, wie dies zu tun:

$router->bind('parameter', function ($parameter) { 

    $model = App\Model::where('field' => $parameter)->first(); 

    if (! $model) { 
     throw new CustomNotFoundException; 
    } 

    return $model; 
}); 
+0

Das gleiche passiert, 'ModelNotFoundException'. – RektByAyyLMAO

+0

Das mache ich mit anderen benutzerdefinierten Ausnahmen, daher passt diese Methode nicht in meine aktuelle Logik. Ich habe viele andere Ausnahmen mit benutzerdefiniertem Verhalten in dieser Renderfunktion bereits. – RektByAyyLMAO

+0

Überprüfen Sie die EDIT. – Maraboc