Alias pro službu vytváří v Nette 2.3 novou službu, proč?
- amik
- Člen | 118
Ahoj,
ve svém konfiguračním souboru používám zkratku
services:
database: @doctrine.default.entityManager
# abych např. zde nemusel vypisovat dlouhý název služby:
nette.userStorage: MyProject\Users\UserStorage( @database::getRepository('MyProject\Users\User') )
Po nedávném upgradu projektu na Nette 2.3 se začly dít divné věci, občas se neuložily entity spravované Doctrine, a tak jsem zjistil, kde je rozdíl. Konfigurátor Nette 2.2 generuje toto:
/**
* @return Kdyby\Doctrine\EntityManager
*/
public function createServiceDatabase()
{
$service = $this->getService('doctrine.default.entityManager');
return $service;
}
Kdežto z Nette 2.3 vylezlo:
/**
* @return Kdyby\Doctrine\EntityManager
*/
public function createServiceDatabase()
{
$service = $this->createServiceDoctrine__default__entityManager();
return $service;
}
Takže už je jasné, která bije, v Nette 2.3 se pro alias vytvoří nová služba. Je to bug nebo feature? :) podle mě je to dost divné chování, člověk by čekal, že se vytvoří alias, a obzvlášť s tou Doctrinou byl docela oříšek přijít na to, že mám na různých místech programu dva různé entity managery.
- David Matějka
- Moderator | 6445
Videl bych to na bug. Ale je to divny, test na to existuje a (asi :) ) prochazi: https://github.com/…factory.phpt#L79
- Filip Procházka
- Moderator | 4668
Vždyť jsi napsal DI Compileru, že chceš novou službu, která bude aliasem jiné služby. To je naprosto validní a očekávané chování.
A místo „muset vypisovat dlouhý název služby“ si injectni EntityManager a repository si vytáhni v konstruktoru nebo v metodě kde je potřeba.
- David Matějka
- Moderator | 6445
A rozbiji to… wait for it.. kdyby/events :)
Vypada to, ze to chovani bylo zmeneno tady (ale to uz bylo v 2.2, coz nesedi s tim, co pise @amik )
Kdyby events totiz navaze vsechny nette eventy na EVM a to tak, ze prida setup. A jelikoz existuje setup, tak neprojde tato podmninka a nette na to nahlizi jako na novou sluzbu.
Kdyz vypnu autowire
option v kdyby/events, tak se to vygeneruje
jak ma (tedy s getService)
- David Grudl
- Nette Core | 8227
Možná by to šlo udělat tak, že
database: @doctrine.default.entityManager
povede k volání
addAlias().
- amik
- Člen | 118
Trochu jsem se v tom povrtal, taky už jsem objevil problém v Kdyby\Events :) Zjevně to tak původně bylo myšleno (a se starou verzí Nette to i fungovalo), že do aliasů Kdyby\Events nemá hrabat (https://github.com/…xtension.php#L277), ovšem v Nette 2.3 zjevně definice služby vypadá jinak.
Hlavně Nette se tak standardně chová, když udělám alias služby, vrátí mi kontejner stejnou a ne novou instanci služby.
No, opravil jsem si to a hodil na to pull request https://github.com/…ents/pull/77 :)
Ad „A místo “muset vypisovat dlouhý název služby” si injectni EntityManager a repository si vytáhni v konstruktoru nebo v metodě kde je potřeba.“ – to se mi právě nelíbí, víc ve stylu DI mi připadá dávat službám jen repository, které potřebují.
- Filip Procházka
- Moderator | 4668
@amik díky za pullrequest, podívám se na to.
to se mi právě nelíbí, víc ve stylu DI mi připadá dávat službám jen repository, které potřebují.
To je právě u EM hodně sporné, protože repository má data číst a na flushování potřebuješ EntityManager.
- amik
- Člen | 118
Filip Procházka napsal(a):
@amik díky za pullrequest, podívám se na to.
to se mi právě nelíbí, víc ve stylu DI mi připadá dávat službám jen repository, které potřebují.
To je právě u EM hodně sporné, protože repository má data číst a na flushování potřebuješ EntityManager.
No, dneska už používám Dao (z Kdyby samozřejmě), který s ukládáním počítá. Tohle je ještě ze starší aplikace – ale zase UserStorage data neukládá, jen si potřebuje vytáhnout uživatele z DB podle id, takže repository stačil.