Hvordan kan jeg gjøre vedvarende enkel i Symfony2?

stemmer
6

Jeg er for tiden å spille rundt med Symfony2 og liker det veldig mye så langt. Et spørsmål har oppstått da, og jeg lurer på hva den beste praksis ville være.

Hvis jeg ønsker å vedvare en entitet jeg må gå som dette:

<?php
$myEntity = new Entity();
$myEntity->setSomeData('just an example');
$em = $this->get('doctrine')->getEntityManager();
$em->persist($myEntity);
$em->flush();

Dette virker som en forferdelig mye kode som må gjøres om og om igjen. Hva jeg foretrekker er noe sånt som at:

<?php
$myEntity = new Entity();
$myEntity->setSomeData('just an example');
$myEntity->persist();

Men basert på hvordan jeg må få foretaket manager, synes dette er langt fra beste praksis. Så hva skal jeg gjøre? Noen tips om hvordan du håndterer det?

Publisert på 30/05/2011 klokken 14:18
kilden bruker
På andre språk...                            


2 svar

stemmer
11

Dette er den vanlige måten å gjøre det for å holde en skikkelig separasjon av bekymringer. Enheter bør ikke om utholdenhet laget.

Hva du enkelt kan gjøre er å legge en snarvei persistAndFlush metode på kontrolleren klassen skjønt, hvis du virkelig har så mange kode som skaper og vedvarer nye enheter.

Svarte 30/05/2011 kl. 14:22
kilden bruker

stemmer
6

Du må heller ikke glemme at flush metoden er faktisk å oppdatere dine endringer på databasen. Dette betyr at hvis du har behov for å vedvare mer enn ett foretak, er det bedre å gjøre en flush på slutten av hver vedvarer drift.

Si du har tre enheter: $entity1, $entity2og $entity3. Da denne koden er ikke optimal:

$em->persist($entity1);
$em->flush();

$em->persist($entity2);
$em->flush();

$em->persist($entity3);
$em->flush();

Denne koden vil gi bedre resultater fordi det vil synkronisere databasen bare én gang:

$em->persist($entity1);
$em->persist($entity2);
$em->persist($entity3);

$em->flush();

Så har en snarvei i kontrolleren som persistAndFlushbør brukes med forsiktighet, fordi det er ikke effektivt når du trenger å vedvare mer enn én enhet. Dette fremgår her i Doctrine2 dokumentasjon (på 3/4 på siden). Her tekst hentet fra den offisielle 2,0 dokumentasjon:

Ikke påberope flush etter hver endring til en enhet eller hver påkallelse av vedvare / fjerne / fusjonere / ... Dette er en anti-mønster og unødvendig reduserer ytelsen til søknaden din. I stedet danner arbeidsenheter som opererer på objektene og ringe flush når du er ferdig. Mens serverer en enkel HTTP-forespørsel bør det være normalt ikke behov for å påkalle strakt mer enn 0-2 ganger.

Hilsen, Matt

Svarte 01/06/2011 kl. 16:14
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more