Forms onSuccess a phpStan

d@rkWolf
Člen | 171
+
0
-

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
+
0
-

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