Forms onSuccess a phpStan
- d@rkWolf
- Člen | 171
Dokázal by mi někdo poradit, jak toto vyřešit (PHPStan nainstalovaný přes Contributte Phpstan, php 8.2, level 9)?
Line ...Presenter.php
------
79 Property Nette\Forms\Form::$onSuccess (array<callable(App\UI\Form\BaseForm, mixed): void>) does not accept non-empty-array<(callable(App\UI\Form\BaseForm, mixed): void)|(Closure(Nette\Application\UI\Form, App\Modules\Admin\UserProfile\UserProfileFormData): never)>.
assign.propertyType
Type App\Modules\Admin\UserProfile\UserProfileFormData of parameter #2 $data of passed callable needs to be same or wider than parameter type mixed of accepting callable.
Běžný formulář, jako v ukázce v dokumentaci „Formulář pro vytvoření i editaci záznamu“, s jediným rozdílem, že nepředávám array, ale používám mapování na třídu(dle dokumentace):
public function actionAdd(): void
{
$form = $this->getComponent('systemForm');
$form->onSuccess[] = [$this, 'addFormSucceeded'];
}
public function actionEdit(int $id): void
{
...
$form = $this->getComponent('systemForm');
$form->setDefaults($defaults);
$form->onSuccess[] = [$this, 'editFormSucceeded'];
}
protected function createComponentSystemForm(): BaseForm
{
$form = $this->formFactory->forBackend();
$form->addText('name', 'Název')
...
return $form;
}
public function addFormSucceeded(BaseForm $form, SystemFormData $data): void
{
...
$this->redirect('System:default');
}
public function editFormSucceeded(BaseForm $form, SystemFormData $data): void
{
...
$this->redirect('System:default');
}
BaseForm extenduje Form, je tam jen přidané nějaké rozšíření – podle contributte/webapp-skeleton.
Jestli to teda vyřešit jde, nebo zbytečně ztrácím čas a mám tam dát prostě ignore next line…
Dá se to, poněkud neprakticky(místo 2 slov jsou to 2 řádky), obejít tím, že ze succeeded odeberu 2.parametr a vytáhnu to z form a ještě mu to nadeklaruju přes var(jinak nevěří, že je v $data opravdu SystemFormData):
/** @var SystemFormData $data */
$data = $form->getValues(SystemFormData::class);
Editoval d@rkWolf (13. 8. 19:00)
- Marek Bartoš
- Nette Blogger | 1311
Dá se to vyřešit, jen to ještě nikdo neudělal.
Na getValues() by mělo být možné přidat generika, aby phpstan typ objektu
chápal.
Parametry metody by snad šly řešit přes PHPStan extension – jsou to
4 roky od doby kdy se to řešilo a vyřešit to nešlo. https://github.com/…te/issues/82