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.
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.
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.
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.
Ensuite, définissez 'debug' => false, dans \ config\local\app.php fichier
<?php
return array(
'debug' => false,
);
Dans laravel 5 pour désactiver le débogage, il vous suffit de commenter
//'debug' => env('APP_DEBUG'),
dans le fichier\config\app.php
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é.
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