Alias pro službu vytváří v Nette 2.3 novou službu, proč?

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

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
+
0
-

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
+
0
-

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
+
0
-

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 | 8154
+
0
-

Možná by to šlo udělat tak, že database: @doctrine.default.entityManager povede k volání addAlias().

amik
Člen | 118
+
0
-

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
+
0
-

@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
+
0
-

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.

enumag
Člen | 2118
+
0
-

@amik Dao je deprecated.

(Omlouvám se za off-topic.)

amik
Člen | 118
+
0
-

@enumag aha, dík za informaci, to jsem ještě nepostřehl.