Phpstan hlásí chybu Cannot call method v Error presenteru
- trta911
- Člen | 35
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
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 | 1274
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)