Nette a Guzzle Middleware

MartinVolenec
Člen | 36
+
0
-

Dobrý den,

řeším projekt, kde komunikuji s API. A při určité odpovědi s určitým HTTP Code a obsahem v Body potřebuji vše ukončit a provést redirect na přihlašovací stránku. A napadlo mě to samozřejmě filtrovat v objektech Middleware.

Jelikož pro vše používám knihovnu Guzzle tak jsem si studoval i jak fungují.

Middleware vytvářím jako objekty s metodou __invoke(). To vše funguje. Jak pro request tak i response:

<?php
class OAuthRedirectMiddleware
{
    public function __invoke(callable $handler)
    {
        return function (RequestInterface $request, array $options) use ($handler) {
            $promise = $handler($request, $options);
            return $promise->then(
                function (ResponseInterface $response) {
                    return $response;
                }
            );
        };
    }
}
?>

Nyní bych ale potřeboval, aby Middleware Response zkontroloval a za určité podmínky provedl redirect.
Má někdo zkušenosti co s tím?

Jelikož já nemám, tak mě ze zoufalosti napadla následující šílenost:
Aby Middleware dědil z UI\Control → může si potom zavolat za určité IF podmínky Presenter a redirect.

Ale toto se Nette nelíbí.

Jsem rád za každou pomoc. Nebo jestli někdo zná efektivnější přístup, rád se poučím.
Děkuji

CZechBoY
Člen | 3608
+
0
-

Ty bys měl vyhodit nějakou výjimku, kterou někde zpracuješ. Nevím kde voláš ty Guzzle požadavky, ale na tom místě bys měl tu výjimku nejspíš i zpracovat. Pokud je to rovnou v presenteru tak tam máš i metodu redirect a máš vyhráno.

MartinVolenec
Člen | 36
+
0
-

Ano, přes výjimku to funguje.

Nicméně mě napadl jiný způsob bez nutnosti použití Middlewaru.

I tak děkuji za pomoc.

CZechBoY
Člen | 3608
+
+1
-

A jak to teda budeš řešit? :-)

MartinVolenec
Člen | 36
+
0
-

@CZechBoY S API jsem nikdy takto nepracoval, takže chyběly zkušenosti. Původně jsem se snažil nahradit modely za jakési Requestery. Ale později tento návrh vůbec nevyhovoval. Často krát bylo potřeba provést redirecty a další věci, který se krásně řeší v presenterech.

Nakonec mi došlo, proč tuto funkcionalitu nevložit přímo do presenterů. Takže v rámci BasePresenteru jsem si vytvořil:

<?php
abstract public function requestOnMonitorAPI(string $method, string $uri = '', array $options = []);
?>

a tu pak upravuji dle potřeby v ostatních presenterech. Je zde pěkné, že se dá napsat jedna implementace funkce a některé presentery si ji mohou přepsat dle potřeby aniž by to ovlivnilo něco jiného.

Možná pro někoho běžný návrh či praxe, ale pro mě novinka. A funguje opravdu dobře.