Symfony2 entityManager i modellen

stemmer
11

Jeg kommer til å bruke entity_manager i min modell. Men entity_manager er bare tilgjengelig i controller: throw $em = $this->get('doctrine.orm.entity_manager'). Så har jeg å definere modellen metoder med $emparameter. Dette gjør PHPUnit testing ganske vanskelig og bryter søknad struktur. For eksempel:

class Settings
{
    public static function getParam( $em, $key )
    {
        $em->createQuery(
            SELECT s
            FROM FrontendBundle:Settings s
            WHERE s.param = {$key}
        );
        return $em->getResult();
    }
}

Er det noen måte å bruke entity_manager tjeneste i modellen delen?

Publisert på 10/02/2011 klokken 04:22
kilden bruker
På andre språk...                            


2 svar

stemmer
14

Først en start notat: av konvensjonen din Entity klassen bør trolig være entall. Så Stille, ikke-innstillinger. Du kan argumentere for at "settings" som en gruppe av relaterte innstillinger kan bli sett på som en enhet. Likevel, noe å huske på.

I Doctrine2, vil du bruke et oppbevaringssted for å gjøre denne type søk. I koden din hvor du skulle ringe Settings::getParam, ville du i stedet hente depotet og spørre det. I symfony2, sier:

// $em is your entitymanager, as you were going to pass to your method above
// $key is the key you were going to pass to your method above
$repository = $em->getRepository('\FrontendBundle\Settings');
$setting = $repository->getByParam($key);

Som standard, uten å skrive kode, repositories definere getByXXXX for hvert felt i enhet.

Hvis du har en mer komplisert spørring å gjøre, kan du utvide depotet.

use Doctrine\ORM\EntityRepository;

class SettingsRepository extends EntityRepository 
{
    public function getBySomeComplicatedQuery() {
        $sort_order = $this->getEntityManager()
            ->createQuery('SELECT count(s) FROM FrontendBundle\Settings s WHERE s.value > 32')
            ->getResult(Query::HYDRATE_SINGLE_SCALAR);
    }

}

Og da vil du kalle denne metoden på samme måte.

Andre vil argumentere for bruk av en leder objekt som ville da ikke være knyttet til Entity / ORM, men det er en unødvendig komplikasjon i dette tilfellet tror jeg.

Doctrine2 er spesielt designet for å ikke la deg bruke spørringer i Entity fil; Enheter og EntityManagers er faktisk to sider av standardmodellen laget, splittet fra hverandre for å håndheve beste praksis. Se denne artikkelen: http://symfony2basics.jkw.co.nz/get-symfony2-working/entities/

Svarte 27/05/2011 kl. 06:17
kilden bruker

stemmer
8

Spørringer i Entity klassen

Putting spørringer i deg enhet virker merkelig for meg. På samme måte som å sette spørsmål til din modell klasse i Lære en det ikke er ansett som en god praksis. Entity klasser bør være lys.

Jeg er faktisk lærer Doctrine2 og tenkte på lignende problem: hvor du skal sette spørsmål?

I Lære en det er spesielle Tabell klasser, og jeg hadde forventet noe lignende i Lære to.

Repository Pattern

I dag har jeg lært at Lære 2 bruker Repository Mønster: http://www.doctrine-project.org/docs/orm/2.0/en/reference/working-with-objects.html#custom-repositories

Men for å hente en forekomst av depot klasse må du bruke Entity Manager. En eller annen må det veien.

Likevel, etter depotet mønsteret synes et bedre valg.

Etter min mening Hvis du insisterer på å ha spørring metoden i Entity klassen må du passere en Entity Manager til det.

testing

Hvorfor behovet for å overføre enhet manager gjør det vanskelig å teste? Fra min erfaring eksplisitte avhengig gjør testing enklere som du kan kontrollere dem i testen (og håne dem for eksempel).

På den annen side passerer foretaket manager til hver metode er ikke riktige valget heller. I så fall ville jeg gjøre avhengigheten obligatorisk og legge den til i contructor.

Svarte 10/02/2011 kl. 15:16
kilden bruker

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