Laravel 5

Intercepter une Erreur [Laravel 5.2]

  • Avatar de MakoubaSetho
    Membre depuis :
    16/10/2017
    Messages :
    14

    Bonjour à tous,
    Je me lance dans la personalisation des erreurs et je rencontre un tout petit obstacle que je peine à contourner...

    Je sais créer des pages qui remplacent les erreurs N°xxx (Type 404, 503, ...), et j'ai trouvé une bonne procédure pour remplacer l'erreur CSRF (TokenMisamatchException) qui surviens 2-4 fois sur 6 lors de la connexion de mes Utilisateurs....

    Seulement je rencontre une autre erreur :
    Je sais pourquoi elle à lieux et j'ai dévellopé une méthode pour la contourner.
    MAIS : mais j'aimerais être vraiment prévoyant et changer le message d'erreur de ce problème afin qu'il redirige sur ma méthode de correction ^^ !
    De cette façon, si ma méthode n'as pas été appliquée à l'utilisateurs pour X ou Y raisons, on l'envois vers une page de lancement manuel de la correction.
    BREF :

    Mon soucis c'est que cette page n'as pas de Numéro d'Erreur, où bien d'identifiant clair comme en avait TokenMismatch et je ne sais quoi donner à mon Handler pour l'intercepter et la rediriger vers ma page d'erreur custom' ...

    J'ai farfouiller les Logs (/app/logs), la page d'erreur dans app/framework/views, mais je ne trouve pas mon bonheur ...
    Une idée de où chercher ?!

    Je joins ma page d'erreur et ma modif' du handler pour vous montrer mes essais ^^ :

    1. La Page :
    2. Le Handler :

      public function render($request, Exception $e) //Si Erreurs
      {
      if ($e instanceof \Illuminate\Session\TokenMismatchException) //Si CSRF, bug de Token Session :
      {
      return response()->view('errors.666', [], 666); //On redirige vers page custom' 666
      }
      else //Sinon
      {
      if($e instanceof \Illuminate\Foundation\Bootstrap\HandleExceptions || $e instanceof \Illuminate\View\Engines || $e instanceof \Illuminate\Http) //Si c'est une erreur Handleou View ou Http ... ?
      {
      return response()->view('errors.667', [], 667); //On redirige vers la page custom' 667
      }
      else //Sinon
      {
      return parent::render($request, $e); //Redirection normales des Erreurs
      }

      }
      }

    Merci d'avance pour vos retours =)

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2123

    Salut,

    Ce n'est pas une erreur "normale" et il faudrait vraiment savoir comment elle survient.

  • Avatar de MaitrePylos
    Membre depuis :
    27/05/2013
    Messages :
    200

    Il y a quoi ligne 30 ?

  • Avatar de MakoubaSetho
    Membre depuis :
    16/10/2017
    Messages :
    14

    C'est une erreur due à la connexion d'un utilisateur qui n'existe pas encore dans ma base de donnée.
    Un "Trying to get propriety of non-object" justifié dans la mesure où :
    A la connexion d'un Utilisateur, s'il n'existe pas, on le créé avec des propriétés par défaut...

    MAIS la page post connexion affiche des données telles que son "Rôle" qu'il concidère alors comme non renseigné.

    La ligne 30, c'est cette fameuse donnée :

    <h6>&nbsp;&nbsp;<u>Vous êtes identifi&eacute; comme &lt;&lt;<i> <?php echo e(Auth::user()->role->nom); ?> </i>&gt;&gt; de votre R&eacute;gion :</u> &nbsp;&nbsp;&nbsp; <strong><u><i><?php echo e($ville); ?></u></i></h6>

    C'est "normal" qu'il ne la connaisse pas à ce niveau, car je n'affecte pas de droits aux utilisateurs lors de leurs connexions/creation.
    La BDD affecte la valeur du champs à "1" par défaut (Rôle de base), mais visiblement, l'Application n'as pas le temps de voir cette relation entre la connexion/création de compte et le chargement de la page d'accueil.

    C'est pourquoi j'aurais aimé faire une page d'erreur redirigeant sur la connexion.
    Si l'Utilisateur nouvellement créé se reconnecte, ses données sont connues et tout passe.

    Bien sûr, je pourrais dévelloper la chose en faisant en sorte que si un utilisateur non connu dans la BDD se connecte, on l'y créé avec le rôle 1 !
    J'ai fait un bouton d'import des Users qui en créer 2-3 et leurs affecte les droits avec une vraie relation d'association :
    $user_BDD->role()->associate(1); //Associate : Association de l'ID du Rôle (1 = User normal).
    Et tous les utilisateurs importés passent sans problème leurs premières connexion puisqu'ils existent déjà en Base ...
    La différence ici est que la création est quasi simultanée à la connexion, et que je comptais sur l'affectation du champs "role_id" à 1 par défaut par MySQL, mais cela semble moins efficace qu'une association manuelle sur le rôle par défaut voulu...

    Ma question n'était pas de résoudre ce problème mais plutôt de savoir si il m'était possible d'être très prévoyant et de générer une page d'erreur spécifique à ce cas où non.

    Cela ne m'empêchera pas de passer par la méthode citée plus haut (Si un utilisateur n'existe pas -> on le créé avec le Role 1),

    Dans tous les cas, les Utilisateurs de mon Appli' seront au final tous importés par le fameux bouton...

    Je me demandais juste si je pouvais couvrir mes arrière d'un éventuel oublis dans ma fonction d'import,
    Et par la même, s'il était possible de personaliser ce genre d'erreur où non !
    Mais quelque chose me dit que l'on va me dire non ^^

  • Avatar de MaitrePylos
    Membre depuis :
    27/05/2013
    Messages :
    200

    Et un simple

    {{Auth::user()->role->nom or 'Invité'}}

    ne suffit pas ?

  • Avatar de F.M.
    Membre depuis :
    10/07/2017
    Messages :
    97

    Cette erreur c'est pas l'intercepter que tu dois, c'est la corriger...

  • Avatar de MakoubaSetho
    Membre depuis :
    16/10/2017
    Messages :
    14

    C'est dans un but correctif additionnel que j'escomptais l'intercepter.
    Il me semble avoir préciser deux fois que la résolution de l'erreur ne me pose pas de problème.
    Il me semble avoir même expliqué juste avant ça, comment et pourquoi elle survient et de quelle façon je peut la résoudre...

    Je voulais simplement prévoir TOUT LES CAS et surtout savoir quoi faire lorsqu'on tombe sur une erreur simillaire et que l'on veut l'intercepter/la redirigier vers une page plus propre.
    C'est bien jolis de donner un "APP_DEBUG = false;" à la Production mais les messages d'erreurs génériques demeurent peu acceptables en Entreprise.

    Oui, une fois le problème contourné, par le conseil de MaitrePylos où par mon ajout d'une association d'un Rôle à la connexion sans compter sur la valeur par défaut de la BD, il est techniquement impossible que l'erreur survienne encore.

    Dans la finalité de mon projet, les Utilisateurs seront importés par un bouton, et donc existerons en base, anihilant le problème.
    Je me suis posé la question d'intercepter cette erreur afin de voir s'il était plus intelligent de faire une redirection spécifique lors des rares cas possibles d'Utilisateurs oubliés par l'import, où de prévoir cela à la connexion en verifiant systématiquement l'existence de l'Utilisateur qui se connecte...
    Pour moi, le traitement était hypothètiquement moins "lourd" sans une vérification de chaque connexion ...
    (Oui, j'ai conscience qu'on parle d'une différence de poids totalement NEGLIGEABLE)
    Mais bref :

    Mon intérêt était plutôt de savoir s'il était possible où non d'intercepter une erreur simillaire, qui ne nous donne ni chiffre ni service clair, pour mes éventuels besoins à venir et par curiosité de fonctionnement.

    Mais puisque l'intérêt semble plutôt au débat de savoir comment résoudre un problème résolu en amont,
    Que la réponse à cette question est donc un "non",

    Je m'en vais clore le sujet,
    En vous remercint d'avoir essayé d'y répondre.

Vous ne pouvez pas répondre à ce sujet.