Details
-
Type:
Documentation
-
Status:
Open
-
Priority:
Minor
-
Resolution: Unresolved
-
Affects Version/s: 2.0.1
-
Fix Version/s: None
-
Component/s: ORM
-
Security Level: All
-
Labels:None
-
Environment:PHP 5.3.3-1ubuntu9.3
KUbuntu 10.10
Description
I registered an event listener to my entity manager and on a postLoad event, I want to prepare some data in a nice way (fetch translations for my library + store into associative array into entity). Here's my snippet:
class TranslationListener implements EventSubscriber { public function getSubscribedEvents() { return array(Events::postLoad); } public function postLoad(LifecycleEventArgs $args) { $em = $args->getEntityManager(); $entity = $args->getEntity(); if ($entity instanceof Lib) { $qb = $em->createQueryBuilder(); $qb = $qb->select('T')->from('Translate', 'T')->join('T.locale', 'TT')->where('T.lib = ?1')->setParameter(1, $entity->idLib); $res = $qb->getQuery()->getResult(); foreach ($res as $tr) { $entity->tr[$tr->locale->idLocale] = $tr; } } } }
When this code is run (eg. getting the Library objects), I got a crash where getResult() is called:
Fatal error: Call to a member function fetch() on a non-object in /home/thepianoguy/testproject/trunk/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php on line 126
Call Stack
# Time Memory Function Location
1 0.0004 656080 {main}( ) ../index.php:0
2 0.1081 18760176 TApplication->run( ) ../index.php:48
3 0.2637 33817288 TApplication->runService( ) ../TApplication.php:382
4 0.2637 33817288 TPageService->run( ) ../TApplication.php:1095
5 0.2698 34788448 TPageService->runPage( ) ../TPageService.php:444
6 0.2715 34986768 TPage->run( ) ../TPageService.php:498
7 0.2716 34989128 TPage->processNormalRequest( ) ../TPage.php:198
8 0.3383 42770128 TControl->loadRecursive( ) ../TPage.php:215
9 0.3383 42770208 ContactUserAddEdit->onLoad( ) ../TControl.php:1286
10 0.3383 42771912 ContactUserAddEdit->loadData( ) ../ContactUserAddEdit.php:56
11 0.3452 43436904 Doctrine\ORM\AbstractQuery->getResult( ) ../ContactUserAddEdit.php:124
12 0.3452 43437296 Doctrine\ORM\AbstractQuery->execute( ) ../AbstractQuery.php:366
13 0.4160 47009328 Doctrine\ORM\Internal\Hydration\AbstractHydrator->hydrateAll( ) ../AbstractQuery.php:537
14 0.4160 47011504 Doctrine\ORM\Internal\Hydration\ObjectHydrator->_hydrateAll( ) ../AbstractHydrator.php:99
If I comment the line 137 in Doctrine/ORM/Internal/Hydration/AbstractHydrator in _cleanup(), my code works fine:
// $this->_stmt = null;
I think there is a problem when using alredy used entity manager and query builder inside the postLoad event.
The hydrator is reused internally, this is potentially dangerous as I figure from your use-case.