2017-04-12 4 views
0

Wir verwenden Symfony für unsere Projekte und es gibt etwas in Doctrine, mit dem ich nicht klar kommen kann. Der Entity Manager von Doctrine (im Folgenden "em") ist ein gemeinsam genutzter Dienst. Wenn ich also em in mehrere Services injiziere, teilen sie genau die gleiche Instanz von em. Einfacher ist es, wenn ich ein Beispiel sofort einführen zu erklären, was ich fragen will: folgendes Beispiel:Shared Doctrine EntityManager-Service

$service1 = $this->get('vendor_test.service_one'); // $service1 has a private entity manager property 
$service2 = $this->get('vendor_test.service_two'); // $service2 as well has a private entity manager property 

$entity1 = $service1->getEntityById(1); // getEntityById() queries for an entity with the given id and returns it. So it is in the managed list of service1's entity manager 
$entity2 = $service2->getEntityById(2); // entity1 and entity2 not necessarily of the same class 

$entity1 
    ->setProperty1('aaaa') 
    ->setProperty2($service2->updateDateTime($entity2)) // updateDateTime() let's say updates a datetime field of the passed entity (in this case entity2) and calls $this->entityManager->flush(); and returns the datetime. 
    ->setProperty3('bbbb') 

$service1->save(); // calls $this->entityManager->flush() so it should update the managed entities (in this case entity1) 

Die Frage ist also: Wenn das EntityManager Objekt von service1 und service2 die gleichen Instanz von EntityManager ist so Sie sind identisch, sie teilen sich die gleiche interne Liste, und wenn $service2->updateDateTime($entity2) einen entityManager->flush() aufruft, wird $ entity1 ebenfalls gelöscht? Wird $ entity1 mit Property1 auf 'aaaa' gesetzt und in der Datenbank aktualisiert und in einem zweiten Schritt geleert, wenn $ service1-> save(); wird genannt?

Hoffe, ich habe es geschafft zu zeichnen, was ich meine und was ich fragen möchte.

Antwort

0

Als ich getestet und jemand kompetenter fragte, ist die Antwort ja, da überall, wo ich Entity Manager sie alle die gleiche verwaltete Liste verwenden. Um das Problem, das in der Frage erwähnt wird, zu überwinden, muss die Entity an den Entity Manager übergeben werden und alle anderen werden intakt sein.