Prepsani existujici service (Nette\Http\User)

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

Zdravim,

je mozne nejakym zpusobem docilit toho, abych mohl v DI Containeru vytvorit tovarnicku pro vlastni sluzbu se jmenem „user“? V soucasne chvili mi to po pridani createServiceUser() hazi InvalidStateException s hlaskou „Service ‚user‘ has already been registered.“

Zkousel jsem najit, kde je nastavene, ze se ma sluzba user nacitat pri startu aplikace, ale marne. Tovarnicku potrebuji mit v containeru a potrebuji v ni predat zavislosti ⇒ neni mozne pouzit services.user.class pripadne services.user.factory v configu.

Lze toto nejak ciste vyresit aniz bych zasahoval primo do samotneho frameworku? Jeste je moznost sluzbu prejmenovat, ale jelikoz je to nahrada za stavajici Nette\Http\User nedava moc smysl mit zaregistrovane sluzby obe.

Predem diky za pomoc :)

22
Člen | 1478
+
0
-
  • co je špatného na default userovi? Nestačí ho akorát podědit a rozšířit eventuelně?
  • API od DI jsi viděl? removeService()/addService() by ti mělo stačit
Elijen
Člen | 171
+
0
-
  • Podedit by to nejspis slo a asi to tak nakonec udelam, ale to stale neresi muj problem s tovarnickou sluzby. (vznikne nova trida dedici od Nette\Http\User)
  • Trochu problem je, ze potrebuju sluzbu definovat v containeru a nevim kde bych tedy mohl removeService()/addService() zavolat
22
Člen | 1478
+
0
-

řekl bych že v bootstrapu po načtení configu, kde se staví default container.

$configurator->container->removeService('user');
$configurator->container->addService('myUser', MyUser::init); //nebo rovnou v config.neon

Editoval 22 (21. 6. 2011 22:19)

Elijen
Člen | 171
+
0
-

Radeji bych to udelal pres config, ale potreboval bych konstruktoru predat jeste nejake zavislosti. (1 sluzba + pole parametru). Lze to nejak docilit? Bohuzel dokumentace ke konfiguraci zrovna chybi :(

22
Člen | 1478
+
0
-

tak asi takto, pokud to chceš přes továrnu:

	services:
		myUser:
			factory: MyUser::init
			options:
				- aaa
				- bbb
Filip Procházka
Moderator | 4668
+
0
-

22 napsal(a):

Chtěl přepsat…

	services:
		user:
			factory: MyUser::init
			options:
				- aaa
				- bbb
22
Člen | 1478
+
0
-

aha, ona jde přepsat default servisa, nevěděl jsem.

Filip Procházka
Moderator | 4668
+
0
-

To by bylo pěkně blbé, kdyby to nešlo :)

Elijen
Člen | 171
+
0
-

Nakonec jsem teda rozsiril Nette\Http\User a pouzil config.neon ke zmene tovarnicky. Dokonce jsem ani nepotreboval options. Parametry jsem si vytahl z automaticky predaneho contextu.

Diky za pomoc :)

hAssassin
Člen | 293
+
0
-

Zdravim, pokousim se o neco podobnyho, ikdyz ne s User ale s Application. Bohuzel kdyz mam configu:

application:
	class: MyApplication

tak to rve, ze tomu chybi parametr $context, coz je sice hezky, ale nejak netusim jak v configu definovat jako parametr samotny context, pokud to tedy vubec jde. Zatim to teda mam takhle:

$container->addService('application', function($container) {
	return new MyApplication($container);
});

coz sice funguje, ale rad bych vedel jestli to nejde definovat i v configu. Diky.

Patrik Votoček
Člen | 2221
+
0
-

V configu to „nejde“ (jde to pokud si $context nadefinuješ jako službu – alias).

$container->addService('context', function($container) {
	return $container;
});

a pak:

application:
        class: MyApplication
	arguments: [@context]

Nicméně spíš bych ti radil udělat si třeba do MyApplication továrničku ve stylu https://api.nette.org/…tor.php.html#309

David Grudl
Nette Core | 8227
+
0
-

Není tam @context ale @container (v poslední verzi).

hAssassin
Člen | 293
+
0
-

@David Grudl > jj, napadlo me zkusit oboji, ale ani jedno nefungovalo. Posledni verzi myslis asi tu gitu, ze? Mam 2.0beta (php 5.3) z 28.5.11 a tam mi to nejde. Mam to v konfigu takto:

application:
	class: MyApplication
	arguments: ['@container']

Sranda je ze treba pro sluzbu user to @user zna… :)

Filip Procházka
Moderator | 4668
+
0
-

Ano, git. Bylo to přidáno až dneska ráno.