web-dev-qa-db-fra.com

Comment attraper les exceptions / pages manquantes dans Laravel 5?

Dans Laravel 5, App::missing et App::error _ n'est pas disponible. Comment vos exceptions de capture et les pages manquantes maintenant?

Je n'ai trouvé aucune information à ce sujet dans la documentation.

59
Marwelln

Dans Laravel 5, vous pouvez intercepter des exceptions en modifiant la méthode render dans app/Exceptions/Handler.php.

Si vous voulez récupérer une page manquante (également appelée NotFoundException), vous devez vérifier si l'exception, $e, est une instance de Symfony\Component\HttpKernel\Exception\NotFoundHttpException.

public function render($request, Exception $e) {
    if ($e instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException)
        return response(view('error.404'), 404);

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

Avec le code ci-dessus, nous vérifions si $e est un instanceof de Symfony\Component\HttpKernel\Exception\NotFoundHttpException et si c'est le cas, nous envoyons un response avec le fichier viewerror.404 en tant que contenu avec le code de statut HTTP 404 .

Ceci peut être utilisé pour N'IMPORTE QUELLE exception. Donc, si votre application envoie une exception de App\Exceptions\MyOwnException, vous recherchez plutôt cette instance.

public function render($request, Exception $e) {
    if ($e instanceof \App\Exceptions\MyOwnException)
        return ''; // Do something if this exception is thrown here.

    if ($e instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException)
        return response(view('error.404'), 404);

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

Avec commit à partir d’aujourd’hui (9db97c3), il vous suffit d’ajouter un fichier 404.blade.php dans le dossier/resources/views/errors/pour le rechercher et l’afficher automatiquement.

15
Cooper Sellers

Depuis les validations 681dc et 9acf685 , la méthode missing() a été déplacée vers la méthode Illuminate\Exception\Handler classe.

Donc, pendant un certain temps, vous pourriez faire ceci:

app('exception')->missing(function($exception)
{
    return Response::view('errors.missing', [], 404);
});


... Mais récemment, une refactorisation a été effectuée à 62ae86 .

Maintenant, ce que vous pouvez faire est d’ajouter ce qui suit à app/Http/Kernel.php:

// add this...
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Response;

class Kernel extends HttpKernel {

    (...)

    public function handle($request)
    {
        try
        {
            return parent::handle($request);
        }

        // ... and this:
        catch (NotFoundHttpException $e)
        {
            return Response::view('errors.missing', [], 404);
        }

        catch (Exception $e)
        {
            throw $e;
        }
    }


Enfin, gardez à l’esprit Laravel est encore en pleine phase de développement et les modifications risquent de se reproduire.

4
Gras Double

Si vous souhaitez conserver le gestionnaire dans votre fichier de routes Web, après vos routes existantes:

Route::any( '{all}', function ( $missingRoute) {
    // $missingRoute
} )->where('all', '(.*)');
2
S..

Le mode HTML5 angulaire peut être à l'origine de nombreuses pages manquantes (l'utilisateur marque quelques pages et tente de recharger). Si vous ne pouvez pas remplacer les paramètres du serveur pour gérer cela, vous pouvez penser à remplacer le comportement de la page manquante.

Vous pouvez modifier la méthode de rendu\App\Exceptions\Handler en un contenu Push avec 200 plutôt qu'un modèle Push 404 avec un code 404.

/**
 * 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 ($this->isHttpException($e) && $e->getStatusCode() == 404)
    {
        return response()->view('angular', []);
    }
    return parent::render($request, $e);
}
2
Sándor Tóth

Laravel est livré avec une page d'erreur par défaut, vous pouvez facilement ajouter des pages d'erreur personnalisées comme celle-ci

1 - Créer une vue d'erreur dans la vue -> dossier des erreurs
2 - Le nom doit correspondre aux erreurs HTTP telles que 404 ou 403 500

`Route::get('/page/not/found',function($closure){
  // second param is  optional 
  abort(404, 'Page Not found');
});`
1
mdamia

En ajoutant le code suivant

protected $dontReport = [
            'Symfony\Component\HttpKernel\Exception\HttpException'
    ];

et

public function render($request, Exception $e)
    {
    return redirect('/');
            //return parent::render($request, $e);
    }

fonctionnera correctement pour moi

0
Swapnil Bijwe