Přidávání filtrů v komponentě a ITemplate->addFilter() a statická analýza (PHPStan, IDE)

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
fordo.pytlik
Člen | 26
+
+2
-

Ahoj,

poslední dobou jsem téměř „posedlý“ statickou analýzou a nástroji jako je PHPStan. Ale setkal jsem se s chybou, kterou nevím, jak vyřešit. Mám presenter:

<?php

class FooPresenter extends BasePresenter
{
	public function beforeRender()
	{
		$this->template->addFilter('bar', function() { /*...*/ } );
	}

	// ...
}

?>

V „běžném provozu“ – tento zápis normálně funguje. Filter barse zaregistruje a funguje to úplně v pohodě. Ale při bližším zkoumání je vidět, že proměnná $this->template je definovaná jako Nette\Application\UI\ITemplate a ITemplate žádnou metodu addFilter() nemá. Z praxe samozřejmě vím, že v $this->template je Nette\Bridges\ApplicationLatte\Template, který metodu addFilter má.

Takže jak z toho ven? A tím nemyslím, jak jen jak „ochcat“ PHPStan, aby prošel, ale přijde mi zvláštní, když komponenta tvrdí, že v $template bude ITemplate tak volat fci, která ITemplate nemá. Líbí se mi právě ta jistota, že tam daná fce je.

Nebo je to hloupost a nikdy jste nic podobného neřešili?

CZechBoY
Člen | 3608
+
+2
-

Já používám

if ($this->template instanceof Template) {
    $this->template->addFilter(...);
} else {
    throw new ...
}
Jan Tvrdík
Nette guru | 2595
+
+6
-

@CZechBoY Což můžeš pragmaticky zkrátit na assert($this->template instanceof Nette\Bridges\ApplicationLatte\Template) (rozumí tomu PhpStorm i PHPStan).

fordo.pytlik
Člen | 26
+
0
-

Děkuji za odpovědi. Jo – takle to z ní logicky :-).