Désactiver les rapports d'erreurs entièrement dans Laravel de production?
Je voudrais désactiver le rapport d'erreurs entièrement sur la production, parce que nous avons quelques très vieux code que nous avons encore besoin de les corriger, mais pour l'instant fonctionne (oui je ne l'aime pas non plus). Nous ne pouvons pas tout régler en quelques jours, donc nous avons juste besoin de supprimer les avertissements et les exceptions comme nous l'avons toujours fait.
Le vrai problème, c'est qu'elle a déjà déclenche une exception sur un simple paresseux bug comme (parce que la var n'est pas défini)
if(!$var) {
//do whatever
}
essayé
APP_DEBUG=false
APP_LOG_LEVEL=urgence
display_errors(false);
set_error_handler(null);
set_exception_handler(null);
Mais il montre encore une ErrorException
Undefined variable: script_name_vars_def
modifier: Le code fonctionne comme ceci
web.php
Route::any('/someroute', 'somecontroller@controllerFunc');
somecontroller.php
public controllerFunc() {
ob_start();
require '/old_index.php';
$html = ob_get_clean();
return response($html);
}
De cette façon, nous utilisons Laravel de routage sans avoir à réécrire le code immédiatement.
Je sais que je peux corriger cet avertissement très facile, mais il ya beaucoup, beaucoup plus de ces erreurs et nous devons utiliser Laravel de routage maintenant. Résoudre les problèmes plus tard.
idées
- Utiliser certains caractères génériques dans
$dontReport
. - Utiliser un
@
de suppression à la bonne place - Peut-il être http://php.net/manual/en/scream.examples-simple.php
modifier pour expliquer après qui suit middleware n'ai pas de travail
1) créer midddleware
php artisan make:middleware SuppressExceptions
2) Écrire
SuppressExceptions.php
public function handle($request, Closure $next)
{
error_reporting(0);
return $next($request);
}
3) Registre
laravel/app/Http/Kernel.php
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\SuppressExceptions::class,
],
APP_DEBUG=false
?Oui, j'ai fait une faute de frappe dans ma question, désolé. Je l'ai activé à nouveau pour copier et coller l'avertissement 🙂
Eh bien, si vous définissez APP_DEBUG=false et il affiche toujours l'erreur de la page avec toutes les informations, envisager d'effacer le cache. Il n'existe aucun moyen supressing la page d'erreur si une erreur se produit, à moins que vous couvrez toutes les fonctions avec try/catch et peut-être rediriger
non, ça montre juste
Whoops, looks like something went wrong.
Je suis désolé, mais je n'ai pas accès au code jusqu'à lundi 🙂
OriginalL'auteur Thomas | 2017-06-28
Vous devez vous connecter pour publier un commentaire.
Oui, vous pouvez modifier le rapport d'erreur. En fait, le cadre fournit un endroit pour intercepter les exceptions:
App\Exceptions\Handler
. Par défaut, lerender
méthode de convertir l'exception renvoyée à une réponse HTML. LeAPP_ENV
etAPP_DEBUG
valeurs ne changer la façon dont cette réponse d'erreur va s'afficher (détails sur la trace de pile d'exception ou pas, en gros).D'essayer de changer le
render
méthode pourCela s'avère essentiel de reporting et tente ensuite de re-répondre à la demande.
Dans le
if
clause vous pouvez vérifier tout à condition que vous le souhaitez (la classe de l'exception, la gravité, etc.). La capture deErrorException
sera probablement répondre à vos besoins, mais notez que vous ne pouvez pas être en mesure de récupérer à partir d'une erreur fatale de cette façon.De toute façon, vous devriez prendre cela comme une "preuve de concept"... Pour les non-quantité de demandes, cette "re-traiter" l'approche n'est pas bonne. Au lieu de cela, juste créer un Middleware avec
Même qu'avant, des erreurs fatales ne peuvent pas être récupérés de cette façon. Mais vous pouvez afficher un message d'erreur personnalisé en combinant cette middleware avec le gestionnaire d'exception approche:
ce qui "ne marche pas"? Vous gardez en voyant le "Oups" message? Quel est l'exception? Avec cette méthode, j'ai essayé et réussi ignoré certaines erreurs comme undefined variable ou une division par zéro
Oui, il ne le montre chaque erreur. Je vais modifier ma question pour expliquer les étapes que j'ai essayé à partir de votre réponse.
vu ton edit. C'est exactement ce que j'ai. Êtes-vous sûr que le parcours est dans la
web
groupe? Essayez de fairedd(something);
dans le middleware de la méthode, juste pour s'assurer qu'il est de l'application.Oui, je suis positif, avez-vous testé votre installation en combinaison avec le code que j'ai écrit dans somecontroller.php à l'aide de
ob_get_clean
? Il pourrait donner des résultats différentsOriginalL'auteur alepeino
Je suppose que votre
php.ini
chargé à partir d'un autre endroit. Si les paramètres de toujours pas appliquées. Essayez de trouver le bon emplacement dephp.ini
(vous pouvez voir les informations dans laphpinfo()
). De toute façon, vous pouvez réécrire ces paramètres à la vôtre dans laindex.php
:Mais comme l' @Dont le dit dans le commentaire. Ces paramètres seront remplacés par Laravel. Donc le code ci-dessus peut être placé dans votre contrôleur. Mais il sera sale hack. Si Vous devez trouver un autre moyen. Essayez d'imprimer votre
.env
's de contenu. Peut-être certains, le réglage est incorrect.oh oui, en effet. Il l'a trouvé dans
bootstrap()
méthode dans leHandleExceptions
classe.OriginalL'auteur Alex Slipknot
La deuxième ligne change la valeur de 'display_errors' dans le
php.ini
fichierEDIT: Ajouter plus de code pour montrer comment cela doit être spécifiques à un environnement...
$env = getenv('APPLICATION_ENV');
Whoops, looks like something went wrong.
pouvez-vous montrer un peu plus de code de ce que vous essayez d'atteindre? Aussi, pas que ceux que ces modifications doivent être spécifiques à un environnement. Voir mes modifications
Vous souhaitez peut-être envisager d'obtenir de l'environnement avec
config('app.env')
au lieu de l'appelergetenv
; si la configuration est mise en cache, l'appel àgetenv
renvoie la valeur null au lieu de production, la mise en scène, etc.Ce ne sera pas avoir une incidence sur Laravel depuis Laravel réinitialise la fonction error_reporting lorsque l'application est démarrée, vous aurez besoin de modifier le cadre de base HandleExceptions.php comme indiqué dans mon exemple.
OriginalL'auteur Pila
Laravel les paramètres de débogage est situé dans le
.env
fichier, dans laquelle vous pouvez définir l'option debug comme suit:mais...
Laravel ont également config mécanisme situé dans
app.php
dans leconfig
dossier, par défaut:qui raconte Laravel pour utiliser le
.env
valeur, et la valeur par défautfalse
, mais toute personne ayant accès au fichier, pouvez simplement modifier:de sorte que votre
.env
valeur est ignorée par Laravel..env
fichier. Prochaine: env fichier a la priorité sur le fichier de configuration, le fichier de config est la valeur de repli.d'accord, mais ce que j'ai dit est juste que, il peut être modifié par une personne ayant accès au fichier de configuration, comme le dernier point de mon intervention?
Il est pas dans le cas, et même si c'étaient les suivants: Le .fichier env annule la
app.php
. Êtes-vous satisfait maintenant?vous êtes un peu trompé sur la
.env
l'emporte sur leapp.php
, elle annule à cause de le second point de mon intervention, et si elle était modifiée, le comportement se modifie. mais si sa ne change pas, puis vous convient le mieux, pas besoin d'être fou. j'étais simplement en supposant que vous travaillez en équipe. regarde comme j'ai eu tortJe fais un travail en équipe. La raison pour laquelle vous agiter moi, c'est vous donner une faible qualité de la réponse et de vous rendre à une des longueurs de la défendre comme une bonne réponse.
OriginalL'auteur am05mhz
Si le problème, c'est que vous voyez le " Oups, quelque chose s'est mal passé sur la page, vous pouvez corriger cela avec la réponse @alepeino a écrit:
https://stackoverflow.com/a/44862789/2777970
Mais je voudrais changer la méthode de rendu:
Cette méthode render (la mère) est celui qui crée et renvoie le code html pour le "Oups" de la page, donc si vous remplacer, vous devez être cool.
De changer de débogage de configuration, vérifiez si votre config/app.php a les options de débogage à l'aide de l'ENV valeur APP_DEBUG, et sur votre production .env, vérifiez qu'il est défini à false (APP_DEBUG=false).
if (!isset($var) || !$var)
de Sorte qu'il vérifie si la variable existe avant de vérifier qu'il est une valeur booléenne, donc vous n'aurez pas une erreur. Mais je pense que vous ne pouvez pas envie de résoudre ce problème ou il n'est pas aussi simple, comme vous l'avez dit, parce que sinon cette question serait anotheroneJ'ai déjà fixe+ de 1000 cas de ce "bug" haha, ma solution btw est
$var = $var ?? null
Nice, php7 caractéristiques
Cela fonctionne partiellement: il s'arrête rendu le reste de la page à atteindre le "bug".
Mais je ne l'obtenez pas, vous avez encore le contenu avant? Ou si vous obtenez l'erreur php? Pour corriger l'erreur php ne devrait pas vous fixer avec le php.ini suggestion quelqu'un a dit?
ini_set('display_errors', 0);
?OriginalL'auteur Juan Pablo
Laravel souligne d'erreur et d'avertissement de code libre, de sorte que la meilleure façon de gérer cela est juste en vous assurant que votre code ne produit pas d'erreurs, des avertissements ou des avis.
Mise à jour: je ne recommande pas la méthode ci-dessous pour les versions récentes de Laravel. Laravel, vous permet désormais de modifier la gestion des exceptions dans un non-classe de fournisseur: App\Exceptions\Gestionnaire comme indiqué par alepeino de réponse. Un middleware peut aussi être une meilleure solution pour la désactivation de la fonction error_reporting.
Cette réponse précédente est maintenue pour des raisons historiques, mais je ne recommande pas de modifier les fichiers de vendor.
Si, toutefois, vous décidez de modifier ce comportement, vous aurez besoin de regarder dans un fichier nommé HandleExceptions.php normalement dans vendor/laravel/framework/src/illuminate/Foundation/Bootstrap/HandleExceptions.php:
La ligne 32, où la fonction error_reporting est actuellement fixé à -1. https://github.com/laravel/framework/blob/5.4/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php
Bien sûr, par la modification de ce code, vous aurez besoin soit de prévenir des mises à jour de laravel/cadre ou vous aurez besoin de vérifier ce fichier à chaque mise à jour.
Après la mise à jour de ce code, vous aurez besoin de recompiler vos classes:
E_ERROR
il n'a pas changé anyhing que ce soitAvez-vous de vider votre cache de l'application et des classes compilées?
claire-compilé est ce que vous voulez, cache:clear ne concerne que les objets mis en cache, pas de classes compilées.
ne fonctionne pas non plus
OriginalL'auteur Devon