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

- loov
 - Člen | 49
 
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
 
Netbeans ti budou našeptávat v momentě, kdy necháš takový container sestavit. Jednoduše dej F5 v prohlížeči.

- loov
 - Člen | 49
 
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 :-)

- ViPEr*CZ*
 - Člen | 822
 
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)

- ViPEr*CZ*
 - Člen | 822
 
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
 
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
 
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?

- mildabre
 - Člen | 62
 
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
 
Nenašeptávejte, ale pište inject metody
:).
Editoval vojtech.dobes (10. 12. 2012 17:16)