web-dev-qa-db-fra.com

Désactiver le gestionnaire d'erreur laravel

Est-il possible de désactiver le gestionnaire d'erreurs laravel tous ensemble?

Je veux simplement afficher standard PHP, pas le Whoops, looks like something went wrong les erreurs.

25
Petah

Non sans violer majoritairement les principes du framework (ce que je vais vous dire comment faire ci-dessous, si vous êtes toujours intéressé).

Il y a quelques choses qui rendent cela difficile à accomplir. Il est assez facile de désactiver les gestionnaires d'erreurs et d'exceptions par défaut

set_error_handler(null);
set_exception_handler(null);

mais cela vous laisse avec deux obstacles majeurs.

La première est que Laravel enregistre un gestionnaire d'arrêt dans le cadre de son amorçage, et cette fonction d'arrêt recherchera la dernière erreur, et s'il s'agissait d'une erreur fatale, appelez manuellement le code de gestion des exceptions. Il y a pas de moyen facile de désinscrire une fonction d'arrêt .

La seconde est que le gestionnaire d'application principal Laravel ressemble à ceci

#File: vendor/laravel/framework/src/Illuminate/Foundation/Application.php
public function handle(SymfonyRequest $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
{
    try
    {
        $this->refreshRequest($request = Request::createFromBase($request));

        $this->boot();

        return $this->dispatch($request);
    }
    catch (\Exception $e)
    {
        if ($this->runningUnitTests()) throw $e;

        return $this['exception']->handleException($e);
    }
}

C'est-à-dire que si votre code d'application lève une exception, Laravel l'attrape ici et appelle manuellement la méthode handleException de l'exception (qui déclenche la gestion d'exception standard Laravel). Il n'y a aucun moyen de laisser PHP gérer une exception fatale qui se produit dans votre application, Laravel empêche cela de se produire.

La partie où je vous dis comment faire ce que vous voulez

Tout cela signifie que nous devons remplacer l'application principale Laravel par la nôtre. Dans bootstrap/start.php, Il y a la ligne suivante

#File: bootstrap/start.php
$app = new Illuminate\Foundation\Application;

Remplacez-le par ce qui suit

ini_set('display_errors','1');
class MyApplication extends Illuminate\Foundation\Application
{
    function startExceptionHandling()
    {
        //do nothing
    }

    public function handle(Symfony\Component\HttpFoundation\Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
    {
        $this->refreshRequest($request = Request::createFromBase($request));

        $this->boot();

        return $this->dispatch($request);
    }    
}

$app = new MyApplication;

La première chose que nous faisons est de définir les erreurs d'affichage de PHP ini sur 1. Cela garantit que les erreurs sont sorties dans le navigateur.

Ensuite, nous définissons une nouvelle classe d'application qui étend la vraie classe d'application.

Enfin, nous remplaçons le véritable objet Laravel $app Par un objet instancié par notre classe.

Dans notre classe d'application elle-même, nous supprimons startExceptionHandling. Cela empêche Laravel de configurer des rappels d'exception, d'erreur et d'arrêt personnalisés. Nous définissons également handle pour supprimer le démarrage/la répartition de l'application d'un try/catch. Il s'agit de la partie la plus fragile du processus et elle peut différer selon votre version Laravel.

Avertissements finaux

Si la méthode handle change dans la future version de Laravel cela cassera.

Si les packages personnalisés reposent sur l'ajout de gestionnaires d'exceptions personnalisés, ils peuvent se casser.

Je recommanderais de rester loin de cela comme autre chose qu'une technique de débogage temporaire.

36
Alan Storm

Ensuite, définissez 'debug' => false, dans \ config\local\app.php fichier

<?php

return array(

    'debug' => false,

);
10
Komal

Dans laravel 5 pour désactiver le débogage, il vous suffit de commenter

//'debug' => env('APP_DEBUG'),

dans le fichier\config\app.php

5
rendra

La gestion des exceptions est codée en dur dans la classe Application. Vous pouvez remplacer les classes dans votre bootstrap/start.php fichier:

class ExceptionHandler {
    public function handleException($exception) {
        throw $exception;
    }
    public function handleConsole($exception) {
        throw $exception;
    }
}

class MyApplication extends Illuminate\Foundation\Application
{
    public function registerExceptionProvider() {}
    public function startExceptionHandling() {}
}

$app = new MyApplication;

Il va sans dire que ce n'est certainement pas encouragé.

2
Andreas

Lié à la question: Laravel a une méthode intégrée pour désactiver les exceptions dans les tests unitaires:

$this->withoutExceptionHandling()

Diffusion sur le sujet: https://laracasts.com/series/whats-new-in-laravel-5-5/episodes/17

0
MacroMan