PHPStan Presenter|null a Template

Jiří Nápravník
Člen | 710
+
0
-

Začínám používat PHPstan více a chci jet na nejvyšší možné úrovni.

Narazil jsem na to, že v komponentách se nelíbí

$this->template->render('cesta');

byl jsem tak na to zvyklý, vím, že jde $this->getTemplate()->setFile()->render();, ale je to trochu zdlouhavé, jak to řešíte vy?

Na nejvyší úrovni narážím na to když v komponentě použiju

$this->getPresenter()->link()

hláška je: „Cannot call method link() on Nette\Application\UI\Presenter|null“, to by sice šlo použít i LinkGenerator za to, ale to getPresenter() používám často, pro isAjax, redirect apod. Jak to řešíte, krom toho abych to musela nějak divoce if-ovat vždy.

Jan Tvrdík
Nette guru | 2595
+
+1
-

To první viz https://forum.nette.org/…-vs-template

sice šlo použít i LinkGenerator

LinkGenerator a Presenter generují linky s jinou sémantikou, tj. typicky si nemůžeš zvolit jestli použiješ LinkGenerator nebo Presenter, protože právě jedna z variant bude správně.

isAjax

Lze volat přímo na Http requestu.

redirect

Bys typicky neměl z komponenty volat.

MajklNajt
Člen | 498
+
0
-

@JanTvrdík čo presne myslíš tým LinkGenerator a Presenter generují linky s jinou sémantikou? ja som si doteraz myslel, že je úplne jedno, ktoré použijem, keďže v kóde mi to v oboch prípadoch prebublá až do $this->router->constructUrl(...)

CZechBoY
Člen | 3608
+
+1
-

Presenter dělá relativní odkazy a LinkGenerator vždy absolutní (včetně domény, protokolu, …).

Jan Tvrdík
Nette guru | 2595
+
+2
-

No hlavně Presenter dělá odkazy v kontextu aktuální requestu, tj. zachovává persistentní parametry. LinkGenerator dělá odkazy mimo kontext aktuální requestu.

Jiří Nápravník
Člen | 710
+
0
-

@JanTvrdík Díky za odpověď.

Co se týče Template vs. ITemplate, v tom vlýkně je několik možných řešení, které je to správné ale?

isAjax jsem nevěděl, že jde na requestu díky.

Nicméne redirect v komponentě jsem nevěděl, že se nemá dělat, jaký je tedy správny postup, pokud je nezbytný. Například přidám zboží do košíku, pokud je ajax tak pouze redirect(‚this‘), pokud není, tak přesměruju na Homepage s FlashMessage, apod. Nebo to dělám špatně? Resp. proč tedy je vlastně $this->getPresenter() v Controlu?

Tharos
Člen | 1030
+
+5
-

Pro inspiraci… Já na tyhle redirecty ke vší spokojenosti používám vlastní události. V komponeně mám událost například onItemAdded a v presenteru (respektive tam, kde komponentu vytvářím a konfiguruji) si na ten event navěsím Closure, která typicky vyřeší flash message a přesměrování či případnou invalidaci snippetů.

Nevím, jestli je to best practice, ale zatím jsem si s tím nikdy nenamlátil… :)

Komponenty pak vůbec neví o nějakých presenterech (mluvím o té části kódu, kterou píšu, nikoliv o poděděném základu). Celkově má pak graf závislostí mezi komponentami podobu stromu.

Tharos
Člen | 1030
+
0
-

Je to sice více než tři roky starý kus kódu, ale našel jsem i ukázku. :)

Jan Tvrdík
Nette guru | 2595
+
+1
-

jaký je tedy správny postup

Viz třeba sandbox.

Jiří Nápravník
Člen | 710
+
0
-

Díky za reakci, v minulosti jsem to taky takhle používal – konkrétně přes Eventy, ale pak jsem se dal cestou, že to budu mít vše v jedné komponentě jako celek, přišlo mi to logičtější, ale asi je to tedy špatná cesta.