Créer un hook en PHP pour les block try & catch
Arthur Monney
@mckenziearts
Quand on dévéloppe 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'éxé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 donner par W3C dans cet article
Cas pratique
Imaginons nous sommes entrain 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.
Arthur Monney
@mckenziearts
Fullstack Designer - Laravel & React Developer. Laravel Cameroon Organizer @laravelcm | @shopperlabs