$form->onSuccess[] = $this->myFormSucceeded; vs $form->onSuccess[] = callback($this, ‚myFormSucceeded‘);

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
chikeet
Člen | 160
+
+1
-

1)

$form->onSuccess[] = $this->myFormSucceeded;

2)

$form->onSuccess[] = callback($this, 'myFormSucceeded');

Jaký je v tom přesně rozdíl? Co je lepší používat a proč? Případně kdy je lepší použít první a kdy druhý způsob (a třetí a případně ještě další, které třeba přibudou :-))?

Editoval chikeet (5. 3. 2015 18:17)

ic
Člen | 430
+
+3
-

… a nebo aby toho nebylo málo ještě

	$form->onSuccess[] = array($this, 'myFormSucceeded');

:)

Editoval ic (5. 3. 2015 18:10)

Jan Endel
Člen | 1016
+
0
-

nejpoužívanější = nejnovější v tomto případě, tedy syntactic sugar:

$form->onSuccess[] = $this->myFormSucceeded;

resp. volil bych možná podle projektu, pokud na něm dělají staří nette harcovníci tak klidně první verze, i když je nejvíc „WTF“ pro nováčky.

Editoval Jan Endel (5. 3. 2015 18:56)

David Grudl
Nette Core | 8282
+
+6
-

A hlavně ještě

	$form->onSuccess[] = [$this, 'myFormSucceeded'];
looky
Člen | 99
+
0
-

Čistě teoreticky, magie bude asi o něco pomalejší, stejně tak callback. Ale rozdíl bude (skoro) neměřitelný..

pepakriz
Člen | 246
+
+11
-

Z mého pohledu je nejlepší:

$form->onSuccess[] = function (...) use (...) {
    $this->myFormSucceeded(...);
};
  1. Protože tomu rozumí IDE
    1. IDE ti nehlásí unused methodu
    2. Neuděláš překlep v názvu metody, protože ti ji napoví autocomplete
    3. bude ti fungovat případný refaktoring
  2. nejedná se o nette magii

Editoval pepakriz (5. 3. 2015 19:25)

Jan Endel
Člen | 1016
+
+2
-

@pepakriz záleží jak je metoda dlouhá, 10+ řádků bych už takhle nepsal.

Casper
Člen | 253
+
+2
-

@JanEndel V té anonymní funkci je ale jen volání obslužné metody, ne samotná obsluha.

Jan Endel
Člen | 1016
+
+1
-

@Casper jak kde :-) raději píšu obecně.

chikeet
Člen | 160
+
+2
-

@pepakriz:

pepakriz napsal(a):

Z mého pohledu je nejlepší:

$form->onSuccess[] = function (...) use (...) {
    $this->myFormSucceeded(...);
};
  1. Protože tomu rozumí IDE
    1. IDE ti nehlásí unused methodu
    2. Neuděláš překlep v názvu metody, protože ti ji napoví autocomplete
    3. bude ti fungovat případný refaktoring
  2. nejedná se o nette magii

Moje IDE rozumí i zápisu $this->myFormSucceeded a napovídá bez problémů (používám NetBeans 7.4 bez nějakého zvláštního nastavování v tomto směru.)

Na druhou stranu tvoje řešení umožňuje používat jako callback i jinou než public metodu, což se může taky hodit. Pokud teda správně chápu, že callbacky formulářů musí být public metody, protože se volají zvenku presenteru/komponenty.

Edit:
@pepakriz: s odstupem času (a po výměně neaktuálních NetBeans za aktuální PhpStorm) používám výhradně tvoje řešení. Díky za inspiraci :-)

Editoval chikeet (20. 4. 2015 20:10)

Jan Endel
Člen | 1016
+
+1
-

@chikeet ano musí.

ic
Člen | 430
+
0
-

chikeet napsal(a):


(používám NetBeans 7.4 bez nějakého zvláštního nastavování v tomto směru.)

Je nějaký důvod používat starší 7.4 ?

chikeet
Člen | 160
+
0
-

ic napsal(a):

chikeet napsal(a):


(používám NetBeans 7.4 bez nějakého zvláštního nastavování v tomto směru.)

Je nějaký důvod používat starší 7.4 ?

Jen nedostatek času na upgrade (nebo špatná organizace, záleží na úhlu pohledu). Ale to už je myslím trochu OT.

Každopádně předpokládám, že když s napovídáním nemají problém NB 7.4, tak nebudou mít ani novější. Ale je možné, že předpokládám špatně, a každý taky zdaleka nepoužívá NB, že :-) Jen mě trochu překvapilo, že hned dva důvody, proč v tomto případě nepoužívat magické řešení, se týkaly napovídání IDE.

potapnik
Člen | 127
+
0
-

A jde při přiřazení přes callback/array přihodit metodě ještě nějaký parametr?

Tomáš Votruba
Moderator | 1114
+
+3
-

@potapnik Ne, jsou předány pouze defaultní ($form a $values).

kolsi
Člen | 131
+
0
-

Ahoj, funguje v Nette 2.3 ještě metoda callback?

$form->onSuccess[] = callback($this, 'myFormSucceeded');

Mám to na více místech (= můžu opravit), ale používám i moduly, které to mají (např. Grido), ale v Nette 2.3 dostanu pouze hlášku: Call to undefined function callback(). V dokumentaci jsem však nenašel zmínku, že tahle metoda už nefunguje.

Pavel Kravčík
Člen | 1205
+
0
-

Není tam změna namespace? Nette\Callback -> Nette\Utils\Callback

David Matějka
Moderator | 6445
+
0
-

Funkce callback se doporucuje nepouzivat jiz od verze 2.1 https://doc.nette.org/…tions/to-2-1, v 2.2 byla presunuta do balicku nette/deprecated

kolsi
Člen | 131
+
0
-

Pokud jde o tuto třídu, tak to na změnu namespace vypadá, ale jde přímo o metodu callback (která tuto třídu pak používá). V Nette 2.2 jsem našel soubor shortcuts.php, který obsahuje:

	function callback($callback, $m = NULL)
	{
		return new Nette\Callback($callback, $m);
	}

V Nette 2.3 toto není a tudíž ta metoda neexistuje.

kolsi
Člen | 131
+
0
-

Aha, zrada! Když stáhnu balík Nette 2.3.4, tak složky Nette a sandbox\vendor\nette obsahují úplně něco jiného. Ve složce Nette ty shortcuts jsou, v sandboxu nikoli.

David Matějka
Moderator | 6445
+
0
-

jelikoz composer v sandboxu neobsahuje ten balicek, jestli chces ty deprecated veci pouzivat, tak si nainstaluj nette/deprecated

kolsi
Člen | 131
+
0
-

David Matějka napsal(a):

Funkce callback se doporucuje nepouzivat jiz od verze 2.1 https://doc.nette.org/…tions/to-2-1, v 2.2 byla presunuta do balicku nette/deprecated

Díky za info. Tvůj post jsem přehlídnul. Já bych to ani nepoužíval, kdyby to nepoužívaly další doplňky (např. Grido).

David Matějka
Moderator | 6445
+
+1
-

@kolsi tak zaloz issue / posli PR u grida