Doctrine ORM s novým Dependency Injection Containerem
- Filip Procházka
- Moderator | 4668
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.
V 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)