Alias a zavináč v config.neon
- Mesiah
- Člen | 240
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
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
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
enumag napsal(a):
Upřesnění: služba
@nette.database.default
je instance třídyNette\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