Nette a Guzzle Middleware
- MartinVolenec
- Člen | 36
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
- MartinVolenec
- Člen | 36
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.
- MartinVolenec
- Člen | 36
@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.