Kdyby/Doctrine – Jak přistoupit k Entity manageru v potomcích \Nette\Object

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

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

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

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

ak chces nacitat uz existujucu entitu tak sa to robi cez Repository:

<?php
$order = $em->getRepository('Objects\Order')->find($orderId);
?>
Skippous
Člen | 21
+
0
-

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

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

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

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!

Filip Procházka
Moderator | 4668
+
0
-

Né nahrazený ale rozšírený :)