Kdyby/Doctrine – Jak přistoupit k Entity manageru v potomcích \Nette\Object
- kastanekdavid
- Člen | 39
Konečně jsem ve své omezenosti rozchodil v Nette extension
Kdyby/Doctrine. Vše funguje skvěle :) … V base presenteru si injectnu přes
hinting instanci \Kdyby\Doctrine\EntityManager
a bez problémů
používám.
Nyní bych však rád do projektu zapojil trochu návrhu a vytvořil si
skupinu tříd, z nichž každá bude reprezentovat entity, které vystupují
v systému (jako např. uživatel, objednávka, košík). Všechny tyto třídy
extendují třídu Base, která zase extenduje \Nette\Object
.
Problém je ale v tom, že v rámci této třídy Base potřebuju získat Entity manager, abych jej mohl v potomcích použít. Momentálně ho předávám přes DI v konstruktoru, což mi příde dost nešikovné.
Nevíte někdo, jak by se dalo dostat k Entity manageru z potomků
\Nette\Object
? A nebo jestli je tento koncept naprosto mimo,
ťukněte 2× :)
- Filip Procházka
- Moderator | 4668
Pokud budeš do entit předávat EntityManager, degraduješ ORM z DataMapperu na ActiveRecord. Navíc entity ani nejsou služby, mizí z paměti a zase jsou do ní načítány podle toho s čím zrovna přes ORM pracuješ, tedy když jim něco dáš přes konstruktor a neuložíš to do property, která se bude ukládat do databáze, tak to po uložení a načtení z entity zmizí (navíc EntityManager ani serializovat nejde).
Závislosti má smysl předávat jenom službám, je lepší se o to u entit nesnažit (taky to jde, byť trochu složitěji). Konkrétně EntityManager jde do entit předávat celkem snadno, umí to přímo Doctrine, ale nedělej to.
- kastanekdavid
- Člen | 39
Díky za vysvětlení. :) … Jenom follow up question: Je tedy špatná
myšlenka chtít vytvořit funkcionalitu, kdy si budu schopen rekonstruovat
např. objednávku pouze z jejího ID, zavoláním
$order = new Objects\Order($orderId);
? To, že nesmím předat
EntityManager do entity, abych si v ní načetl z DB doplňující info, tuto
funkcionalitu nemůžu udělat.
- David Ďurika
- Člen | 328
ak chces nacitat uz existujucu entitu tak sa to robi cez Repository:
<?php
$order = $em->getRepository('Objects\Order')->find($orderId);
?>
- Skippous
- Člen | 21
Doporučil bych nejdřív projít dokumentaci doctrine ať pochopíš
filozofii práce s entitou..
http://docs.doctrine-project.org/…objects.html
- mkoubik
- Člen | 728
Jeden z principů doctrine je, že se snaží tvářit že žádná
databáze vlastně neexistuje a všechny entity jsou neustále někde v paměti
sdílené napříč requesty. Z toho vyplývá, že konstruktor se volá jen
když chceš založit novou entitu, pokud ji jen načítáš z databáze, tak
už se konstruktor nevolá (doctrine na to má takový ošklivý trik
s deserializací).
Jinak viz předřečníci.
- Filip Procházka
- Moderator | 4668
kastanekdavid napsal(a):
Je tedy špatná myšlenka chtít vytvořit funkcionalitu, kdy si budu schopen rekonstruovat např. objednávku pouze z jejího ID, zavoláním
$order = new Objects\Order($orderId);
To je asi ta největší prasárna co můžeš v Doctrine udělat :)
- kastanekdavid
- Člen | 39
Díky všem za komentář :) … Toto není původem moje myšlenka, snažil jsem se ji pouze ukrást z Prestashopu :) Tam je zřejmě použití tohoto konceptu na místě, jelikož nepoužívají ORM, a tak tenhle způsob zanáší do kódu jakýsi pořádek při práci s databází.
Nedošlo mi však, že Doctrine tohle pokrývá repositářema, který jsou v \Kdyby\Doctrine nahrazený DAO.
Díky za ujasnění všem!