Phpstan hlásí chybu Cannot call method v Error presenteru

trta911
Člen | 32
+
0
-

Hraju si trochu s phpstanem a v rámci projektu jsem ho dostal na level 8 pouze s jedinou chybou a tu nevím jak odstranit (spíše než nutnost je to pro zajímavost)
mám Error presenter, který je z nette sandboxu původní bez úprav a phpstan hlásí tuto chybu:

Cannot call method getMethod() on Nette\Application\Request|null.

V kódu toho presenteru to vypadá takto

final class Error4xxPresenter extends Nette\Application\UI\Presenter
{
    /**
     * Error4xxPresenter constructor.
     *
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Startup presenteru
     *
     * @throws Nette\Application\BadRequestException
     */
    public function startup(): void
	{
		parent::startup();

        $requestMethod = $this->getRequest()->getMethod();
		if ($requestMethod !== Nette\Application\Request::FORWARD)
		{
			$this->error();
		}
	}
 (zkráceno)

No a hlásí to u toho getrequest->getmethod. Ono to asi funguje, spíše by mě zajímalo ze zvědvosti jak toto ošetřit. zkoušel jsem to staticky, když jsem injectnul nette\application\request tak to přestalo řvát ale zas to házelo chybu že tomu chybí v configu parametry nebo co :-)

Editoval trta911 (4. 7. 2021 10:49)

Petr Parolek
Člen | 455
+
+1
-

Ahoj, musíš přidat property-read viz můj presenter:

<?php
declare(strict_types = 1);

namespace App\Presenters;

use Nette;

/**
 * @property-read Nette\Bridges\ApplicationLatte\Template $template
 * @property-read Nette\Application\Request               $request
 */
final class Error4xxPresenter extends BasePresenter
{

	public function startup(): void
	{
		parent::startup();
		if (!$this->request->isMethod(Nette\Application\Request::FORWARD)) {
			$this->error();
		}
	}

	public function renderDefault(Nette\Application\BadRequestException $exception): void
	{
		// load template 403.latte or 404.latte or ... 4xx.latte
		$file = __DIR__ . '/templates/Error/' . $exception->getCode() . '.latte';
		$file = is_file($file) ? $file : __DIR__ . '/templates/Error/4xx.latte';
		$this->template->setFile($file);
	}

}
?>
Marek Bartoš
Nette Blogger | 1146
+
0
-

On je to v podstatě nereálný případ, že by ti metoda vrátila null. Request se do property nastavuje v metodě presenteru run() a tu aplikace volá hned po vytvoření presenteru. Jediná místa kde request z presenteru nedostaneš je jeho konstruktor a callback onRequest v Application (kde ho lze získat přímo z Application)

trta911
Člen | 32
+
0
-

Díky moc za informace, pomohlo :-)
@MarekBartoš jj to chápu, jen mě nešlo do hlavy proč ten phpstan u zrovna tohohle řve