2016-07-23 14 views
0

Hier Customizing ist die Dokumentation: https://laravel.com/docs/5.2/routing#route-model-bindingDie "Not Found" Verhalten von Laravel des Routing "Explicit Binding"

Die Routen:

Route::group(['prefix' => 'u'], function() { 
    Route::post('create', ['as' => 'createUser', 'uses' => '[email protected]']); 
    Route::get('{uuid}', ['as' => 'userDashboard', 'uses' => '[email protected]']); 
}); 

Die UserController.php:

public function dashboard(User $uuid) 
{ 
    return View::make('user.dashboard'); 
} 

Jedes Mal, wenn die Der Benutzer wurde in der Datenbank nicht gefunden und löst diese zwei Ausnahmen aus:

2/2 
NotFoundHttpException in Handler.php line 103: 
No query results for model [App\User]. 

1/2 
ModelNotFoundException in Builder.php line 303: 
No query results for model [App\User]. 

Wie kann ich den Fehler anpassen? Ich möchte auf die Route createUser umleiten. Die Dokumentation weist an, ein Closure als drittes Argument zu übergeben, aber ich weiß nicht, wie das mit meinem aktuellen Code zu tun ist.

EDIT 1

Dies ist, was ich bisher ohne Erfolg versucht haben:

Route::model('{uuid}', ['as' => 'userDashboard', 'uses' => '[email protected]'], function() { 
     App::abort(403, 'Test.'); 
    }); 

    Route::get('{uuid}', ['as' => 'userDashboard', 'uses' => '[email protected]'], function() { 
     App::abort(403, 'Test.'); 
    }); 
+0

bist du im Debug-Modus? hier die Dokumentation: https://laravel.com/docs/5.2/errors#custom-http-error-pages – ClearBoth

+0

@ClearBoth Ja. Ich möchte auf eine andere Seite umleiten, anstatt einen Fehler anzuzeigen. – RektByAyyLMAO

Antwort

1

Dies ist eigentlich sehr einfach. Da keine der Antworten wirklich eine definitive Antwort gibt, beantworte ich sie selbst.

in der Datei RouteServiceController.php ‚s boot Funktion fügen Sie folgende:

$router->model('advertiser', 'App\Advertiser', function() { 
     throw new AdvertiserNotFoundException; 
    }); 

Dann eine neue leere Klasse in App\Exceptions (in diesem Fall) genannt erstellen AdvertiserNotFoundException.php:

<?php 

namespace App\Exceptions; 

use Exception; 

class AdvertiserNotFoundException extends Exception 
{ 

} 

Das letzte, was zu ist es, die Ausnahme in der Handler.php 's render Funktion (App\Exception) wie folgt zu fangen:

public function render($request, Exception $e) 
{ 
    switch ($e) 
    { 
     case ($e instanceof AdvertiserNotFoundException): 
      //Implement your behavior here (redirect, etc...) 
    } 
    return parent::render($request, $e); 
} 

Das war's! :)

0

Dazu müssen Sie überprüfen, ob die ID wie so im Modell vorhanden:

public function dashboard(User $uuid) 
{ 
    if(User::find($uuid)) 
    { 
     return View::make('user.dashboard'); 
    } else { 
     redirect('xyz'); 
    } 
} 
+0

Die Funktion wird nicht gestartet, wenn das übergebene Argument nicht in der angegebenen Datenbanktabelle des Modells ('User') gefunden wird. – RektByAyyLMAO

+0

hmmm .. Ich sehe so ist der beste Weg, mit Middleware zu gehen. – ClearBoth

0

Sie konnten die Ausnahme hinzufügen und behandeln in in app/Exceptions/Handler.php

/** 
* Render an exception into an HTTP response. 
* 
* @param \Illuminate\Http\Request $request 
* @param \Exception $e 
* @return \Illuminate\Http\Response 
*/ 
public function render($request, Exception $e) 
{ 
    if (!env('APP_DEBUG')) {  
     if ($e instanceof \Illuminate\Database\Eloquent\ModelNotFoundException) { 
      //treat error 
      return response()->view('errors.404'); 
    } 

    return parent::render($request, $e); 
} 

Edit 1: Dieses Stück Code ist aus einem Arbeitsprojekt so, wenn dies nicht funktioniert es muss irgendwo anders einen Fehler hat:

if ($e instanceof \Illuminate\Database\Eloquent\ModelNotFoundException) { 
    $data= \App\Data::orderBy('order', 'asc')->get();        
    return response()->view('errors.404', [ 
     'data' => $data     
    ], 404); 
} 

Edit 2: Sie können Verwenden Sie den obigen Code und this tutorial, um einen neuen Ausnahmetyp zu erstellen, um Ihr gewünschtes Verhalten zu erhalten. Nach meinem Verständnis zumindest. :)

+0

Wie kann ich verschiedene Fehler für verschiedene Modelle/Routen anpassen? In diesem Fall möchte ich auf die Seite zur Benutzererstellung umleiten, aber in einer anderen Implementierung möchte ich möglicherweise auf eine andere Seite umleiten. Ihre Methode wendet dieselbe Regel für jede 'ModelNotFoundException' an. – RektByAyyLMAO

0

Ich denke, dieses Tutorial hilfreich sein wird für Sie Laravel Model Binding

+0

Es zeigt ziemlich genau dasselbe wie die Dokumentation. [This] (https://mattstauffer.co/blog/implicit-model-binding-in-laravel-5-2#custom-exceptions-for-route-model-binding) ist der Teil, der mich interessiert, aber kann nicht herausfinden, wie man es mit Controllern verwendet. Ich gebe das dritte Argument, aber es tut nichts. – RektByAyyLMAO

1

für einen ähnlichen Fall, dass ich tat, nahm ich das übergeordnete Illuminate\Foundation\Exceptions\Handler isHttpException Funktion und kopiert sie auf app/Exceptions/Handler.php und änderte seinen Namen in meine isUserNotFoundException.

protected function isUserNotFoundException(Exception $e) 
{ 
    return $e instanceof UserNotFoundException; 
} 

und als in der Funktion

if ($this->isUserNotFoundException($e)) 
     return redirect('path')->with('error',"Your error message goes here"); 

folgenden Code hinzufügen machen muss

$router->model('uuid', 'App\User', function() { 
throw new UserNotFoundException; 

}) in Ihrem RouteServiceProvider :: Boot-Methode platziert werden;

und stellen Sie sicher, dass dies in Ihrer View-Datei können Sie

und das Forum Post aufzunehmen helfen

https://scotch.io/tutorials/creating-a-laravel-404-page-using-custom-exception-handlers 
+1

Danke. Wie hast du das '-> mit()' (Flash-Session) funktioniert? Ich habe alles versucht und es funktioniert einfach nicht. – RektByAyyLMAO

+0

überprüfen Sie bitte die modifizierte Zeile für Redirect, und ja, stellen Sie sicher, "{{Sitzung ('Fehler'}}} 'Fehler in Blade-Vorlage –

+0

Ich kann nicht die Flash-Sitzung arbeiten, überprüfen Sie bitte meine andere Frage, wenn Sie würden sei so nett: [hier] (http://stackoverflow.com/questions/38553083/laravel-5-2-flash-session-not-working) – RektByAyyLMAO