Našeptávání metod a členských proměných služby z DI containeru

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

Ahoj,

v config.neonu jsem si definoval takto službu statisticsService:

<?php
		dibiConnection:
				class: DibiConnection
				arguments: ['%dibiConnect%']

		statisticsService: StatisticsService(@dibiConnection)
?>

v presenteru se k té službě dostanu přes context, ale jaksi už nevidím dovnitř té služby, respektive IDE Netbeans my nenašeptávají co ta služba umí. Chtěl bych se proto poradit, jakým způsobem toho docílit?

Filip Procházka
Moderator | 4668
+
0
-

Netbeans ti budou našeptávat v momentě, kdy necháš takový container sestavit. Jednoduše dej F5 v prohlížeči.

loov
Člen | 49
+
0
-

F5 jsem dal ve firefoxu několikrát, ale stále žádné našeptávání…

Tharos
Člen | 1030
+
0
-

Možná, že chybí už anotace @property-read \SystemContainer|Nette\DI\IContainer $context u Presenteru. Vyzkoušej použít plnou verzi Nette (rozuměj ne-minified). Minified verze právě tyhle anotace neobsahuje.

loov
Člen | 49
+
0
-

„plnou“ verzi nette používám, ale nikam jsem explicitně anotaci nenapsal, kam bych jí měl prosím zapsat?

Tharos
Člen | 1030
+
0
-

V tom případě je moje rada lichá… Ty anotace jsou přímo součástí Nette, jen jsou odstraněné v minified verzi. Pokud používáš „plnou verzi“, vše je oanotované správně. Takže to asi bude chyba ze strany NetBeans…

loov
Člen | 49
+
0
-

Problém vyřešen:

  • ve startupu presenteru si uložím službu do private proměnné přes vlastní setter
  • pomocí phpDoc (@var názevTřídy) řeknu Netbeans co proměnná obsahuje a voilà Netbeans mi našeptávají vše co danná služba obsahuje

Není to bůh ví jaké řešení, ale třeba tu ještě někdo řeší podobný problém :-)

Jan Endel
Člen | 1016
+
0
-

A nedědíš někde presenter tak, že přepisuješ property context bez anotace že se jedná o SystemContainer? To by dle mého bylo asi jednoduší řešení.

loov
Člen | 49
+
0
-

Nepřepisuji, ale zjistil jsem, že jsem neznalý Nette. Přistupoval jsem k proměnné $context ze svého presenteru takto $this->context… No ale když k ní přistupuji tímto způsobem $this->getContext()->mojeService->… tak se vše v klidu napovídá :-)

ViPEr*CZ*
Člen | 817
+
0
-

loov napsal(a):

Nepřepisuji, ale zjistil jsem, že jsem neznalý Nette. Přistupoval jsem k proměnné $context ze svého presenteru takto $this->context… No ale když k ní přistupuji tímto způsobem $this->getContext()->mojeService->… tak se vše v klidu napovídá :-)

Jj to je kvůli „černý magii“ setterů a getterů (takhle se to chová ne jen u DI) a Netbeans todle nepoberou.

Editoval ViPEr*CZ* (27. 2. 2012 10:12)

Jan Endel
Člen | 1016
+
0
-

Mě osobně Netbeans napovídájí i když zadám $this->context->…

Jan Jakeš
Člen | 177
+
0
-

Přesně tak, NetBeans to poberou díky anotacím @property.

ViPEr*CZ*
Člen | 817
+
0
-

Aha, tak jsem to zkusil a vážně to pobere. Tak to se omlouvám. Tak to bylo něco jinýho, až to zas najdu, tak to, když tak postnu.

PS: tak jsem teď při práci… a třeba z modelu mi to nenašeptalo nic teď… takže to asi úplně nefunguje 100%.

Editoval ViPEr*CZ* (1. 3. 2012 17:22)

frosty22
Člen | 373
+
0
-

Mě Netbeans (7.1.2.) dělá totéž, při získání metodou getContext našeptává i z generovaného SystemContainer, ale při $this->context pouze z rozhraní IContainer. Osobně jsem vyřešil anotací v BasePresenteru:

<?php
/**
 *
 * @property-read \SystemContainer $context
 */
abstract class BasePresenter extends Presenter { ... }
?>

Editoval frosty22 (2. 5. 2012 16:07)

vvoody
Člen | 910
+
0
-

loov napsal(a):

Problém vyřešen:

  • ve startupu presenteru si uložím službu do private proměnné přes vlastní setter
  • pomocí phpDoc (@var názevTřídy) řeknu Netbeans co proměnná obsahuje a voilà Netbeans mi našeptávají vše co danná služba obsahuje

Není to bůh ví jaké řešení, ale třeba tu ještě někdo řeší podobný problém :-)

Co je na tomto rieseni podla teba zle? Instanciacia sluzby este pred tim, nez vies, ze ju budes potrebovat?

LuBoss
Člen | 21
+
0
-

Tak mám také negativní zkušenost s našeptáváním funkcí z DI kontejneru v NetBeans 7.2
a je úplně jedno, zda napíšu
$objekt = $this->context->createKomponenta();
nebo
$objekt = $this->getContext()->reateKomponenta();

Poradíte prosím někdo, zda to jde nějak vyřešit?

frosty22
Člen | 373
+
0
-

Zkusil jsi to, co jsem psal výše

mildabre
Člen | 62
+
0
-

loov napsal(a):

Nepřepisuji, ale zjistil jsem, že jsem neznalý Nette. Přistupoval jsem k proměnné $context ze svého presenteru takto $this->context… No ale když k ní přistupuji tímto způsobem $this->getContext()->mojeService->… tak se vše v klidu napovídá :-)

To je škoda, DGX si dal práci, aby se mohlo psát i v PHP

$this->context->sluzba	// jako v plně objektových jazycích

místo:

$this->getContext()->sluzba	// jako ve starém PHP bez Nette

Ten druhý způsob ale v Netbeans funguje. Když použiji tu druhou variantu, našeptává mě to ihned, ale stovky různých metod a vlastností z celého containeru, takže si stejně musím pamatovat jak daná služba kterou hledám alespoň začíná.

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Nenašeptávejte, ale pište inject metody :).

Editoval vojtech.dobes (10. 12. 2012 17:16)