Astuces Laravel
2 min de lecture 285 vues

Laravel Tips: Créer un hook pour capturer les erreurs

mckenziearts

Arthur Monney

@mckenziearts

Laravel Tips: Créer un hook pour capturer  les erreurs

Dans cet article nous allons voir comment créer un hook personnalisé en PHP pour pouvoir capturer nos exceptions.

C'est quoi une exception ?

D'après le W3schools une Exception est un objet qui décrit une erreur ou un comportement inattendu d'un script PHP. Et il rajoute ceci par la suite: Les exceptions sont un bon moyen d'arrêter une fonction lorsqu'elle rencontre des données qu'elle ne peut pas utiliser.

Habituellement quand t-on développe on peut être sujet à capturer des erreurs. Et en PHP la manière la plus simple de capturer nos erreurs c'est d'utiliser un bloc try {} catch()

la syntax est la suivante

try {
// du code qui peut lancer des exceptions
} catch(Exception $e) {
// le code qui s'exécute lorsqu'une exception est détectée
}

Le hic?

En développant notre projet, site ou application (que ce soit web ou une API), les actions deviennent de plus en plus importantes et on se retrouve entrain d'intégrer d'autres services tiers (social login, service de paiement, etc.). Alors on execute beaucoup de fois ce bloc de code. Pour la plus part des exceptions (sinon toutes) hérite de la classe Exception de PHP, partant de ce fait nous n'avons pas exceptionnellement besoin d'utiliser plusieurs classes d'exception pour capturer nos erreurs (ceci reste mon avis).

Ma solution adaptée

Pour ne pas avoir à réécrire le même bloc genre 200 fois j'ai créé un hook (fonction d'aide) qui contient le code suivant

function attempt(Closure $closure): array
{
$result = null;
$throwable = null;
 
try {
$result = $closure();
} catch (Throwable $exception) {
$throwable = $exception;
}
 
return [$throwable, $result];
}

Cette fonction prend en paramètre une Closure et retour un tableau qui contient le résultat de la Closure ou l'exception qui a été levée durant l'exécution de cette Closure.

Puis dans mon code je l'appelle de la manière suivante :

[$error, $response] = attempt(fn () => SubscriptionPayment::run(
$plan->price,
'Paiement pour l\'abonnement '. $plan->name,
route('subscription.cancel-url', ['planId' => $plan->id]),
route('subscription.return-url', ['userId' => $user->id, 'planId' => $plan->id, 'type' => $plan->slug]),
$customData
));

Et dans ce cas, si vous obtenez une exception vous pouvez aisément la traiter de la manière suivante

if ($error) {
return $this->errorResponse(__('Une erreur s\'est produite durant la procédure de paiement.'), ['error' => $error->getMessage()]);
}

J'espère que cette petite function va vous permettre de rendre votre code plus propre et plus lisible.

mckenziearts

Arthur Monney

@mckenziearts

Fullstack Designer - Laravel & React Developer. Laravel Cameroon Organizer @laravelcm | @shopperlabs

Vous aimez cet article ? Faite le savoir en partageant