Latte addFilter a PHPStan level = 2

motorcb
Člen | 551
+
0
-

Ahoj,
pokouším se zvednou PHPStan na level 2. Končím ale na následujícíc chybě:

 ------ --------------------------------------------------------------------------
  Line   app\Components\UserDetail\UserDetail.php
 ------ --------------------------------------------------------------------------
  41     Cannot call method getLatte() on Nette\Application\UI\Template|stdClass.
 ------ --------------------------------------------------------------------------

Jedná se o komponentu, kde používá latte filter:

	public function render()
	{
		$latte = $this->template->getLatte();
		$latte->addFilter('anonimize', function (string $text) {
			return "xxx";//loginka filtru
		});

		$this->template->setFile(__DIR__ . '/UserDetail.latte');
		$this->template->userRow = $this->userRow;
		$this->template->render();
	}

Jak to děláte vy aby byl PHPStan spokojený?
Díky

kminekmatej
Generous Backer | 34
+
0
-

Také jsem to řešil, problém je že template je v parentu definován jako Nette\Application\UI\Template|stdClass. Stačí před to dát Asserci na správnou classu:

assert($this->template instanceof \Nette\Bridges\ApplicationLatte\Template);
Marek Bartoš
Nette Blogger | 1175
+
0
-

Je zbytečné psát všude assert, když nejspíš vždy budeš používat Latte. Stačí do base presenteru přidat anotaci

use Nette\Application\UI\Presenter;
use Nette\Bridges\ApplicationLatte\Template;
use Nette\Bridges\ApplicationLatte\TemplateFactory;

/**
 * @property-read Template $template
 * @method TemplateFactory getTemplateFactory()
 * @method Template createTemplate()
 * @method Template getTemplate()
 */
abstract class BasePresenter extends Presenter {}

Editoval Marek Bartoš (30. 12. 2023 15:02)

Marek Bartoš
Nette Blogger | 1175
+
0
-

Pokud chceš mít přehled o nových chybách a vidět ty existující, tak je fajn nastavit PHPStan na level 8 (maximální level 9 je většinou nereálné splnit) a vygenerovat si baseline s přehledem existujících chyb.
Nikdy nevyřešíš všechny chyby. Kupříkladu u Nette formulářů je to zbytečně komplikované a nedostal by ses tak na vyšší level.