Moznost pridat alias sluzby v konfiguraci

xr
Člen | 94
+
0
-

Ahoj,

Je nejaka moznost pridat alias sluzby v konfiguracii?

Nieco taketo:

<?php
//neon
services:
	foo: My\Foo\Service

	# alias
	bar: @foo
?>

Vyssie uvedene je fajn a funguje, pokial nepouzivate dekoratory. Avsak pokial dekoratory pouzivate,

<?php
//neon
decorator:
	My\Foo\Service:
		setup:
			- callFooSetup
?>

metoda callFooSetup bude volana dvakrat, pretoze vo vygenerovanom DI kontajneri createServiceBar interne vola createServiceFoo, ale callFooSetup volanie sa nachadza v oboch metodach.

To ma neziaduce ucinky. Je mozne nejako pridat alias sluzby bez DI rozsirenia a uprav v PHP kode Nette? Diky!

Existuje ContainerBuilder::addAlias metoda, ale je ju samozrejme mozne volat len pocas vytvarania kontajneru v DI rozsireniach.

David Grudl
Nette Core | 8227
+
0
-

Ano, bar: @foo není alias, ale vytvoření nové služby. Alias lze přidat jen přes DI rozšíření.

xr
Člen | 94
+
+1
-

Mozno by bolo pekne take nieco dorobit, nemyslis? Skusim sa na to pozriet.

xr
Člen | 94
+
+1
-

No ved ano – ak to dava zmysel, pozriem na to.

David Grudl
Nette Core | 8227
+
0
-

A k čemu je to užitečné? U těch extensions to existuje jen z důvodu zpětné kompatibility, ale proč to dělat v konfigu nevím.

xr
Člen | 94
+
0
-

Robim nejaku magiu so sluzbami a potrebujem, aby pouzivali istu konvenciu nazvov. Zaroven vsak potrebujem, aby sa volali tak, ako boli povodne navrhnute (kvoli logickemu rozdeleniu). Je to zlozite na vysvetlenie.

Zjednodusene:
mam sluzbu logicky zaclenenu k nejakej casti aplikacie moduleA.fooService, ale zaroven chcem na rovnaku sluzbu pristupit aj pomocou featureA.fooService, inak povedane, sluzbu potrebujem logicky zadelit do dalsej skupiny.

Chapem, ze je to okrajovy pripad.

Ak chces podotknut, ze aj tak nie je vhodne na sluzby pristupovat pomocou nazvu (vzhladom na princip DI), tak mas pravdu, ale potrebujem to z dovodu cyklickych zavislosti a poziadavku na „lazy loading“ sluzieb.

David Grudl
Nette Core | 8227
+
0
-

Tak to vyřeš tou extension a je to.

xr
Člen | 94
+
+3
-

Tak vytvoril som trivialne dedikovane DI rozsirenie, pre referenciu ho sem pastujem:

<?php
class AliasDiExtension extends Nette\DI\CompilerExtension
{
	public function loadConfiguration()
	{
		$builder = $this->getContainerBuilder();
		foreach ((array) $this->config as $alias => $serviceName) {
			$builder->addAlias($alias, $serviceName);
		}
	}
}
?>

Takto je mozne vytvorit v neone konf s aliasmi:

<?php
alias:
	bar:		foo
	myAlias:	myService
?>
dkorpar
Člen | 136
+
0
-

maybe moving this to cz part of forum?

David Grudl
Nette Core | 8227
+
0
-

done