Retour aux articles

Cet article a été publié à l'origine sur Laravel Cameroun

Lire l'article original

Php

Créer un hook en PHP pour les block try & catch

Créer un hook en PHP pour les block try & catch

Quand on développe une API ou que l'on souhaite faire une intégration d'une API tier, notre code se retrouve très rapidement avec une suite d'instructions et de block try {} catch() {} pour s'assurer que notre code s'exécutera correctement.

Alors dans cet article je vais vous donner mon approche pour rendre le code plus clair en créant un Hook pour traiter plus facilement nos blocs try catch.

Si vous voulez savoir ce que s'est qu'un hook je vais vous renvoyer sur la définition donnée par W3C dans cet article

Cas pratique

Imaginons-nous sommes en train d'écrire une API ou même d'intégrer une et nous avons ce bloc de code qui peut se répéter encore et encore

private static function setHttpResponse(string $method, string $url, array $body = []): \GuzzleHttp\Psr7\Response
{
static::setRequestOptions();
 
try {
static::$response = static::$client->{strtolower($method)}(
NotchPay::$apiBase . '/' . $url,
['body' => json_encode($body)]
);
} catch (ClientException | ServerExceptionn | ConnectException $e ) {
if($e instanceof ConnectException) {
throw new ApiException("Notch Pay Server unreachable");
}
throw new ApiException(self::getResponseErrorMessage($e), self::getResponseErrors($e));
}
 
return static::$response;
}

Si vous avez 5 ou 10 cas comme cela, ça va surcharger votre code et vous aurez des actions répétitives à effectuer.

Ma solution

Après avoir eu ce cas spécifique, de faire face à plusieurs instructions try catch ou je devais refaire la même chose, je suis tombé sur l'idée de faire un mini Hook en php pour le réutiliser partout ou j'aurai besoin de faire un try catch

/**
* @param Closure $closure
* @return array
*/
function useTryCatch(Closure $closure): array
{
$result = null;
$throwable = null;
 
try {
$result = $closure();
} catch (Throwable $exception) {
$throwable = $exception;
}
 
return [$throwable, $result];
}

Alors que fait ce hook il prend en paramètre une Closure (pour savoir plus sur les closures) et retourne un tableau de valeurs $throwable qui est l'exception qui est levée et $result qui est le résultat de notre Closure.

Et maintenant on peut simplifier notre code précédant avec le résultat suivant

private static function setHttpResponse(string $method, string $url, array $body = []): \GuzzleHttp\Psr7\Response
{
static::setRequestOptions();
 
[$throwable, $result] = useTryCatch(fn () => static::$client->{strtolower($method)}(
NotchPay::$apiBase . '/' . $url,
['body' => json_encode($body)]
));
 
if($throwable instanceof ConnectException) {
throw new ApiException("Notch Pay Server unreachable");
}
 
 
return $result;
}

Ceci est juste un exemple d'implémentation, vous pouvez bien le rendre encore plus complexe selon les cas. Par exemple passer aussi un tableau d'exception à lever et traiter les retours en fonction.

Je vous laisse pousser la reflexion encore plus loin pour vos cas spécifiques. Prenez soin de vous Shalom.