PHPStan ITemplate vs Template
- Sitole
- Člen | 39
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?
- CZechBoY
- Člen | 3608
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:
- v BaseControl anotaci přepsat
- udělat si rozšíření reflexe třídy a phpstanu říct že v $this->template je Application template
- metoda getTemplate(), která vykoná kod co je nahoře
Editoval CZechBoY (22. 10. 2018 21:47)
- Milo
- Nette Core | 1283
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.
- Tomáš Votruba
- Moderator | 1114
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.
- Tomáš Votruba
- Moderator | 1114
To je ok, jen public metody navíc oproti interface tam nemají co dělat.