ReflectionException Function () does not exist

pavelinnuendo
Člen | 33
+
0
-

Zdědil jsem jeden projekt v Nette 2.3 a potřebuji jej zmigrovat do 2.4., nicméně jsem si vylámal zuby na této chybě, která se zobrazí, pokud odešlu form:

ReflectionException #04
message protected => "Function () does not exist"
string private => ""
code protected => 0
file protected => "/var/www/html/vendor/nette/reflection/src/Reflection/GlobalFunction.php"
line protected => 45
trace private => array (10)
previous private => null
xdebug_message => "
ReflectionException: Function () does not exist in /var/www/html/vendor/nette/reflection/src/Reflection/GlobalFunction.php on line 45

Problém je v tom, že v poli $handlers je první záznam null:

vendor/nette/forms/src/Forms/Form.php:446	source  Nette\Forms\Form->invokeHandlers(arguments)
$handlers
array (2)
0 => null
1 => Closure #01
file => "/var/www/html/app/AdminModule/PriceModule/Presenters/PriceListPresenter.php"
line => 32
variables => array ()
parameters => "$form"

Můžete mi prosím navézt, čím by to mohlo být?

Editoval pavelinnuendo (18. 3. 2018 0:51)

CZechBoY
Člen | 3608
+
0
-

ukaz jeste kod

pavelinnuendo
Člen | 33
+
0
-

No to je právě problém, jaký kód z toho množství kódu. :)

Už jsem přišel na to, co to způsobuje, a to pokud na Form objektu nastavím více než jednou:

$form->onSuccess[] = function ($form) {}

to zapříčiní tuto divnou chybu, není to bug?
Je možné, pokud potřebuji reagovat na odeslání formuláře na dvou místech, toto tedy vyřešit nějak jinak?

CZechBoY
Člen | 3608
+
+1
-

Nikde jinde se na onSuccess nenavesujes?

pavelinnuendo
Člen | 33
+
0
-

No právě že ano, je to tam na dvou místech. Proč je to špatně? Je na to nějaký workaround?

CZechBoY
Člen | 3608
+
+1
-

Ukaz jak to pridavas. Jestli pridavas normalne anonymni funkci tak je jedno kolik jich pridas. Spis tam bude nekde neco jinak.

pavelinnuendo
Člen | 33
+
0
-

Aha, ano, tak to byl celý problém, jedna funkce není anonymní:

		$this->onSuccess[] = $this->saveValuesToEntity();

Když jsem to přepsal na:

		$this->onSuccess[] = function($form) {
			$this->saveValuesToEntity();
		};

tak to funguje. Jde o správné řešení?

Děkuji moc!

Editoval pavelinnuendo (18. 3. 2018 14:55)

Jan Mikeš
Člen | 771
+
+1
-

@pavelinnuendo je to správně řešení. Vím, že dříve jsem používal také zápis $this->onSuccess[] = $this->saveValuesToEntity (bez závorek), ale protože to bylo moc magické tak jsem to přestal používat a možná to už ani v dnešních verzích nette fungovat nebude :-)

CZechBoY
Člen | 3608
+
+1
-

jo, tys totiz dal do onSuccess vysledek volani funkce…

btw takovyhle problemy by mel odhalit PhpStan, pokud neznas doplrucuju vyzkouset