Nextras/ORM registrace repositáře z DI

Barbarossa
Člen | 74
+
0
-

Ahoj,

chtěl bych se zeptat zda je možnost zaregistrovat repositář do modelu přes DI extenzi. Využít bych to chtěl při tvorbě vlastních composer balíčků (users, articles atd.). Jestli to jde, tak je to dobré řešení nebo na to jdu úplně špatně?

Nikde jsem nedohledal co dělá třeba DependencyProvider nebo RepositoryLoader (a jak je použít). Díky za každou radu.

David Matějka
Moderator | 6445
+
+3
-

Ahoj, zajímá tě RepositoryFinder, defaultně se používá PhpDocRepositoryFinder, ale můžeš jej nahradit za DIRepositoryFinder, nextras pak bude hledat repozitáře dle registrovaných služeb v DIC namísto php docu. v configu stačí uvést něco jako:

orm:
	repositoryFinder: Nextras\Orm\Bridges\NetteDI\DIRepositoryFinder

a pak registrovat jednotlivé repozitáře jako službu

hrach
Člen | 1834
+
+1
-

Doc je k tomu na webu: https://nextras.org/…l-definition#…

Barbarossa
Člen | 74
+
0
-

pokud použiju definici služby jako níže v příkaldu tak mi to hodí Service of type Nette\Caching\Cache needed by $cache in Nextras\Orm\Mapper\Dbal\DbalMapper. Nette/Cache by už měla být zaregistrovaná stejně jako dbal connection a coordinator ne?

services:
    - MyApp\PostsRepository(MyApp\PostsMapper(..., @nextras.orm.cache))

Editoval Barbarossa (20. 5. 2019 15:43)

hrach
Člen | 1834
+
0
-

A jmenuje extension, kterou jsi zaregistroval, nextras.orm?

Barbarossa
Člen | 74
+
0
-

jj

extensions:
    nextras.dbal: Nextras\Dbal\Bridges\NetteDI\DbalExtension
    nextras.orm: Nextras\Orm\Bridges\NetteDI\OrmExtension

nextras.orm:
    model: App\Model\Orm\Orm
    repositoryFinder: Nextras\Orm\Bridges\NetteDI\DIRepositoryFinder

services:
	- MyApp\PostsRepository(MyApp\PostsMapper(..., @nextras.orm.cache))
hrach
Člen | 1834
+
0
-

Vlastni nextras orm cache registruje OrmExtension. Co je vygenerovano v kontejneru? A jak vypada servise nextras.orm.cache?

Barbarossa
Člen | 74
+
0
-

Jo vytvoří se pod jménem: nextras.orm.cache s instancí Nette\Caching\Cache
Nenajde to žádnou instanci Nette\Cache (pokud to nechám prázdné).
Zapomněl jsem zmínit že to zkouším na Nette 3.0 (DI 3.0, Caching 3.0, Orm a Dbal 3.1…)

https://pasteboard.co/IfIpPQg.png

FilipH
Člen | 6
+
+1
-

Zkusil bych:

services:
	- MyApp\PostsRepository(MyApp\PostsMapper(cache: @nextras.orm.cache))
Barbarossa
Člen | 74
+
0
-

@FilipH paráda díky!

Jak tu cache ale zaregistrovat do DI abych ji nemusel do toho argumentu předávat?

Tj aby stačilo tohle:

services:
    - MyApp\PostsRepository(MyApp\PostsMapper()
FilipH
Člen | 6
+
0
-

Ćistě teoreticky:

services:
	nextras.orm.cache:
		autowired: true

Pak by se ten zápis dal použít. Ale nepouštěl bych se do toho, mohlo by to mít hodně „zajímavé“ vedlejší účinky.

hrach
Člen | 1834
+
0
-

@Barbarossa a ty mas jakou verzi nette di?

Barbarossa
Člen | 74
+
0
-

@FilipH super díky s tím to funguje!

@hrach nette/di 3.0.0

balbos
Člen | 1
+
0
-

Zdravím,
prošel jsem detailně toto vlákno a i další příspěvky na fóru a moc moudrý z toho nejsem.
Řeším podobný problém jako @Barbarossa – v rámci aplikace chci mít několik composer balíčků (Users, Articles, Categories, apod.). Je v celku pravděpodobné, že v rámci jednoho balíčku bude i více ORM repozitářů (např. Articles a Categories společně, Users samostatně).

Bohužel jsem nikde nenašel nějaký příklad, podle kterého bych toto udělal.
Můžete mě prosím někam navést? Nebo zaslat odkaz na open source projekt, kde je to takto vyřešené?

Díky

Marek Bartoš
Nette Blogger | 1146
+
0
-

@balbos Měl by ti stačit tento config. Pak už jen registruješ jednotlivé repozitáře a mappery do služeb.

extensions:
	dbal: Nextras\Dbal\Bridges\NetteDI\DbalExtension
	orm: Nextras\Orm\Bridges\NetteDI\OrmExtension

orm:
	model: Nextras\Orm\Model\Model
	repositoryFinder: Nextras\Orm\Bridges\NetteDI\DIRepositoryFinder

services:
	- Nette\Caching\Cache

Případně se mrkni, jak mám setup udělaný já: https://github.com/…/wiring.neon