Doctrine ORM s novým Dependency Injection Containerem

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Filip Procházka
Moderator | 4668
+
0
-

Propojení Doctrine ORM pomocí CompilerExtension

Chcete vědět jaké krásy jsou čarovat s novým DIC v Nette? Tak čtěte dál :)

Asi bych začal nepodstatným detailem, že jsem si po vzoru Symfony doplnil do Nette něco jako balíčky.

Jejich seznam si vytáhnu z config app/config/packages.neon, vytvořím instance a pak volám události aplikace. Jsou to v podstatě takové malé „pod-aplikace“. Každá má události jako application a některé navíc.

Základní balíček vypadá takto.
Vlastní implementace pak může vypadat takto.

Kdyby\Package\DoctrinePackage\Registry

Celou Doctrine mám zabalenou do třídy Registry. Má metody podobné EntityManageru a jde z ní vytáhnout všechny dbal připojení, EntityManagery a mělo by je jít z registru i resetovat.

balíčku pak připojuji Compilery.

DoctrinePackage\DI\AnnotationExtension

Annotace registrují služby pro čtení annotací, což vyžaduje Doctrine pro AnnotationDriver.

V současnosti tam mám jedno nastavení. Je možné v configu předat aliasy.

annotation:
	aliases:
		Orm: Doctrine\ORM\Mappings #výchozí, není potřeba nastavovat

DoctrinePackage\DI\DbalExtension

Dbal kompletně se stará o DBAL vrstvu doctrine. Zde se nastavuje připojení k databázi.

Základní konfigurace:

dbal:
	user: root
	password: heslo

Všechno co je možné nastavit pro jedno připojení je zde

Kdybych si chtěl nastavit více připojení k databázi, tak takto:

dbal:
	defaultConnection: conn1 # když nebude uvedeno, automaticky je výchozí první nastavené
	connections:
		default:
			host: localhost
			user: root
			password: heslo
		conn1:
			host: kdyby.org
			user: root
			password: heslo
	types:
		custom: MySuperNewStringType

DoctrinePackage\DI\OrmExtension

Orm se stará o nakonfigurování EntityManagerů, jejich driverů na metadata, kešování a pak taky o to, jaký connection se vybere pro jaký EntityManager

Jako základ není potřeba vůbec nic nastavovat, je ovšem možné si nastavit jeden EntityManager, kde povolené klíče jsou tyto

orm:
	connection: conn1
	metadataFactoryClass: My\ClassMetadataFactory

Nevo více EntityManagerů

orm:
	defaultEntityManager: default # opět nepovinné
	entityManagers:
		default:
			connection: conn1
			metadataFactoryClass: My\ClassMetadataFactory
		second:
			connection: default
		third:
			connection: default
			dql: #vlastní DQL rozšíření
				string:
	        	                testString: My\StringFunction
				numeric:
					testNumeric: My\NumericFunction
				datetime:
					testDatetime: My\DatetimeFunction
			hydrators:
				custom: My\CustomHydrator

DoctrinePackage\DI\FixtureExtension

Fixture je jedno z rozšíření Doctrine a používám ho především při testování. Více info na githubu

DoctrinePackage\DI\DoctrineExtension

Zbylo mi pár věcí, které nemělo smysl mít ani u jednoho CompilerExtension, pokud by nebyly všechny v jedné třídě.

Tohle „jenom“ vytvoří několik aliasů a taky prohledá vaše služby, jestli nějaká nemá tag „doctrine_eventSubscriber“

services:
	doctrine_orm_events_mySubscriber:
		class: MyMagicSubscriber
		tags: [doctrine_eventSubscriber]

Takto ji zaregistruje do všech EventManagerů všech připojení. Pokud je potřeba jen v některém, tak je možné specifikovat jméno připojení v atributech tagu.

tags:
	doctrine_eventSubscriber:
		connection: conn1

Disclaimer: inspirace pramení od tud.


Kdyby si s tím někdo chtěl pohrát:

$ git clone git://github.com/Kdyby/sandbox.git
$ sandbox/prepare

Nějaké nápady, dotazy?

Editoval HosipLan (23. 12. 2011 20:22)

Jan Endel
Člen | 1016
+
0
-

Otázka jenom jedna, kde je tlačítko donate! ?

Filip Procházka
Moderator | 4668
+
0
-

Koukni na sandbox ;)

Editoval HosipLan (23. 12. 2011 20:23)

awsickness
Člen | 98
+
0
-

jj opravdu zajimave reseni. jen tak dal.

davidm
Člen | 81
+
0
-
david@david-notebook ~/Projects/sandbox $ ./prepare
sh: vendor/vendors: not found

Jinak to vypadá super!!!

Filip Procházka
Moderator | 4668
+
0
-

Ha, zradil mě gitignore :) Už jsem to tam přidal.