PHPStan ITemplate vs Template

před 5 měsíci

Sitole
Člen | 27
+
+1
-

Ahoj,
při spouštění PHPStanu jsem konkrétně na levelu 2 narazil na problém při kterém se mu nelíbí můj způsob renderování komponent za pomoci $this->template->render('template.latte'), protože v anotacích u Nette\Application\UI\Control se definuje jako ITemplate tak i jako Template. ITemplate nepřijímá do metody render žádné parametry, ale Template přijímá cestu k šabloně. Předpokládám, že to má nějaký důvod, ale přišlo mi hezčí tohle jednořádkové volání namísto ne tak hezkého:

$this->template->setFile(__DIR__ . '/templates/Selector.latte');
$this->template->render();

Z jakého důvodu tomu tak je, popřípadě nešlo by se toho zbavit či přidat nějakou vyjímku třeba do balíčku PHPStan-Nette?

před 5 měsíci

CZechBoY
Člen | 3311
+
0
-

Zkontroluj, že v $this->template je to co očekáváš a když ne tak vyhoď třeba výjimku.

$template = $this->template;
if (!$template instanceof \Nette\Bridges\ApplicationLatte\Template) {
    throw new Exception('pls Application template');
}

$template->render('template.latte');

Samozřejmě to může být trošku ubíjející to všude psát…
Řešení jsou asi dvě až tři:

  1. v BaseControl anotaci přepsat
  2. udělat si rozšíření reflexe třídy a phpstanu říct že v $this->template je Application template
  3. metoda getTemplate(), která vykoná kod co je nahoře

Editoval CZechBoY (22. 10. 2018 21:47)

před 5 měsíci

ali
Člen | 283
+
+1
-

Ja to resim takto

/**
 * @property \Nette\Bridges\ApplicationLatte\Template $template
 */
class Component extends \Nette\Application\UI\Control
{
}

Editoval ali (23. 10. 2018 5:54)

před 5 měsíci

Sitole
Člen | 27
+
0
-

Použití skrze BaseControl bude asi v mém případě nejlepší a zároveň nejhezčí řešení.

Ještě malý dodatek. Jaky to tam má důvod a popřípadě proč se toho nezbavit úplně už na úrovni knihovny?

před 5 měsíci

MajklNajt
Člen | 156
+
0
-

ja to používam takto:

$this->template->setFile(__DIR__ . "/template.latte")->render();

tých 11 znakov naviac ma nazabije

před 5 měsíci

Felix
Nette Core | 902
+
+2
-

@Sitole Nedavno jsem o tom psal clanek.

https://f3l1x.io/…bo-controlu/

před 5 měsíci

Sitole
Člen | 27
+
0
-

@Felix To vypadá jako fajn řešení, ale stále mi neodpovídá na otázku proč se u Control definuje obojí ještě když Template implementuje ITemplate.

Ale děkuji, použiji.

před 5 měsíci

Milo
Nette Core | 1128
+
+1
-

Továrna na šablony nemusí vracet Latte šablonu. Jen obecnou ITemplate. Správně by tedy mělo být v anotaci jen to. Jenže všichni používají Latte, tak je tam i druhá anotace, aby IDE nenadávalo při setFile() a podobných. Ze stejného důvodu se tam přidává stdClass, aby IDE nenadávalo při setování proměnných do šablony.

před 5 měsíci

Tomáš Votruba
Moderator | 1154
+
+1
-

Braní něco opravit toto přímo v Nette? Přijde mi to jako zbytečný pain-points, když se o tom píšou opakované články a je potřeba přidávat traity a upravovat/přidat v každém projektu base control i base presenter.

před 5 měsíci

CZechBoY
Člen | 3311
+
+3
-

Ono není co opravovat… prostě Nette používá interface aby si mohl použít jakoukoliv jinou implementaci. To že téměř všichni používají Latte je věc jiná.

před 5 měsíci

Tomáš Votruba
Moderator | 1154
+
0
-

To je ok, jen public metody navíc oproti interface tam nemají co dělat.

před 5 měsíci

MajklNajt
Člen | 156
+
+1
-

Tomáš Votruba napsal(a):

To je ok, jen public metody navíc oproti interface tam nemají co dělat.

prečo nie? interface mi určuje, aké medóty musia byť implementované, a nelimituje ma, že nemôžem použiť iné public metódy…