Alias a zavináč v config.neon

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

Ahoj,
jen se chci ujistit: @nette.database.default není alias, ale jde o instanci objektu Nette\Database\Default, ale

services:
    database: @nette.database.default
    authorizator: Auth(@database) # database je alias, tedy "zkratka" pro instanci objektu Nette\Database\Default

A tyto instance jsou nalezeny pomocí autowiringu. Antowiring jde přes všechny třídy, které jsou resolvovány autoloaderem, nebo se omezuje pouze na dependency injection container, anebo dependency injection container obsahuje instance všech třít – tedy i těch objevených autoloaderem (takže teoreticky i sám sebe)?

Editoval Mesiah (11. 12. 2013 23:27)

Jan Tvrdík
Nette guru | 2595
+
0
-

Autowiring zná jen ty třídy, které jsou registrovány do DI containeru. Žádná automatická registrace všech tříd nalezených autoloadingem neprobíhá.

enumag
Člen | 2118
+
0
-

Upřesnění: služba @nette.database.default je instance třídy Nette\Database\Connection.

A ne, v uvedeném případě autowiring vůbec nepoužíváš. Autowiring je automatické přiřazení služby na základě typehintu, v tvém případě by to bylo takto:

services:
	authorizator: Auth
class Auth extends \Nette\Object implements \Nette\Security\IAuthorizator
{

	public function __construct(\Nette\Database\Connection $connection)
	{
		//...
	}

	//...

}

Jak vidíš, v configu nemám žádné database – názvy služeb by neměly být téměř vůbec podstatné a proto je prakticky zbytečné vytvářet aliasy.

Služba @nette.database.connection bude přesto třídě Auth při vytváření předána a to na základě toho typehintu v konstruktoru – tohle automatické předání (respektive přiřazení na základě typu) je autowiring.

Kontejner umí autowirovat jen služby které má zaregistrované a to ještě jen ty u kterých je to zapnuté. Když máš dvě služby stejného typu, může být autowiring zapnutý jen u jedné, druhou musíš předávat explicitně.

Kontejner je sám o sobě službou, takže umí pomocí autowiringu předat i sám sebe (\Nette\DI\Container).

Editoval enumag (11. 12. 2013 23:55)

Mesiah
Člen | 240
+
0
-

enumag napsal(a):

Upřesnění: služba @nette.database.default je instance třídy Nette\Database\Connection.

1. Jasně, omlouvám se za nepřesnost, soustředil jsem se na popis problém a terminologie mi utekla.

A ne, v uvedeném případě autowiring vůbec nepoužíváš. Autowiring je automatické přiřazení služby na základě typehintu, v tvém případě by to bylo takto:

services:
	authorizator: Auth
class Auth extends \Nette\Object implements \Nette\Security\IAuthorizator
{

	public function __construct(\Nette\Database\Connection $connection)
	{
		//...
	}

	//...

}

Jak vidíš, v configu nemám žádné database – názvy služeb by neměly být téměř vůbec podstatné a proto je prakticky zbytečné vytvářet aliasy.

Služba @nette.database.connection bude přesto třídě Auth při vytváření předána a to na základě toho typehintu v konstruktoru – tohle automatické předání (respektive přiřazení na základě typu) je autowiring.

2. K tomuhle bych se ještě zeptal, proces autowiringu hledá třídy z výsledků vyhledávání robotloaderu?

Kontejner umí autowirovat jen služby které má zaregistrované a to ještě jen ty u kterých je to zapnuté. Když máš dvě služby stejného typu, může být autowiring zapnutý jen u jedné, druhou musíš předávat explicitně.

Kontejner je sám o sobě službou, takže umí pomocí autowiringu předat i sám sebe (\Nette\DI\Container).

3. rozumím, díky

enumag
Člen | 2118
+
0
-

Ne, autowiring nemá s autoloadingem vůbec nic společného. Záleží pouze na registrovaných službách.

Mesiah
Člen | 240
+
0
-

Myslím to takhle, jestli je Autowiring automatické přiřazení služby na základě typehintu, pak někde musí být udržován seznam/tabulka s dostupnými třídami – kdo tento seznam vytváří a udržuje?
Nebo se pletu a funguje to úplně jinak?

enumag
Člen | 2118
+
0
-

ContainerBuilder. Najdi si info jak se píší extensions a podívej se do zdrojáku NetteExtension.