2012-10-29 13 views
8

In Symfony2 si può lavorare con più gestori di entità e di usare qualcosa come il codice qui sotto:Come iniettare gestori di entità non predefiniti?

$em = $this->get('doctrine')->getManager(); 
$em = $this->get('doctrine')->getManager('default'); 

$customerEm = $this->get('doctrine')->getManager('customer'); 

Possiamo iniettare il gestore predefinito per ogni servizio utilizzando:

"@doctrine.orm.entity_manager" 

Come si può iniettare non -dei gestori di entità predefinite nei servizi?

risposta

23

Se il gestori di entità nome config è non_default allora si può fare riferimento come @doctrine.orm.non_default_entity_manager

+0

Giusto per essere sicuri, è necessario crearlo come un diritto di servizio. – d0001

+1

Non è necessario creare il servizio. Symfony lo creerà automaticamente. Lo stesso vale anche per le connessioni. –

+1

Inoltre è possibile eseguire il comando 'php app/console container: debug' per verificarlo. –

1

Ciao prima di tutto crea il tuo manager, nel mio esempio creo il responsabile per la mia classe dell'oggetto che si trova in un CoreBundle:

<?php 
// src/Sybio/Bundle/CoreBundle/Manager/ItemManager.php: 

namespace Sybio\Bundle\CoreBundle\Manager; 

use Sybio\Bundle\CoreBundle\Entity\Item; 

class ItemManager 
{ 
    /** 
    * @var \Doctrine\ORM\EntityManager $em entity manager 
    */ 
    protected $em; 

    /** 
    * @var \Doctrine\ORM\EntityRepository $em repository 
    */ 
    protected $repository; 

    /** 
    * @var string $entityName 
    */ 
    protected $entityName; 

    /** 
    * Constructor 
    * 
    * @param EntityManager $em 
    * @param string $entityName 
    * 
    * @return void 
    */ 
    public function __construct(EntityManager $em, $entityName) 
    { 
     $this->em = $em; 
     $this->repository = $em->getRepository($entityName); 
     $this->entityName = $entityName; 
    } 

    /** 
    * Save a entity object 
    * 
    * @param Object $entity 
    * 
    * @return Object Entity 
    */ 
    public function save($entity) 
    { 
     $this->persistAndFlush($entity); 

     return $entity; 
    } 

    /** 
    * Remove a entity object 
    * 
    * @param Object $entity 
    * 
    * @return Object Entity 
    */ 
    public function remove($entity) 
    { 
     return $this->removeAndFlush($entity); 
    } 

    /** 
    * Persist object 
    * 
    * @param mixed $entity 
    * 
    * @return void 
    */ 
    protected function persistAndFlush($entity) 
    { 
     $this->em->persist($entity); 
     $this->em->flush(); 
    } 

    /** 
    * Remove object 
    * 
    * @param mixed $entity entity to remove 
    * 
    * @return void 
    */ 
    protected function removeAndFlush($entity) 
    { 
     $this->em->remove($entity); 
     $this->em->flush(); 
    } 

    /** 
    * Returns entity repository object 
    * 
    * @return EntityRepository 
    */ 
    public function getRepository() 
    { 
     return $this->repository; 
    } 

    /** 
    * Create a new object 
    * 
    * @return mixed 
    */ 
    public function createNewObject() 
    { 
     return new Item(); 
    } 

    // Create your own methods to manage the object 

} 

Se la struttura responsabile è condivisa tra gestore multipla, è possibile creare un BaseManager esteso da tutti gli altri gestori!

quindi registrarlo nella services.yml (o xml) file del bundle:

# src/Sybio/Bundle/CoreBundle/Resources/config/services.yml or xml !: 

parameters: 

    # Managers _________________ 

    sybio.item_manager.entity: SybioCoreBundle:Item 
    sybio.item_manager.class: Sybio\Bundle\CoreBundle\Manager\ItemManager 

services: 

    # Managers _________________ 

    sybio.item_manager: 
     class:  %sybio.item_manager.class% 
     arguments: [@doctrine.orm.entity_manager, %sybio.item_manager.entity%] 

Questo è tutto, è ora possibile utilizzare:

// Controller: 

$im = $this->get('sybio.item_manager'); 

$item = $im->createNewObject(); 
$im->save($item); 

È quindi possibile migliorare il vostro responsabile , qui mi darà un array di parametri di configurazione per il mio manager:

# src/Sybio/Bundle/CoreBundle/Resources/config/services.yml or xml !: 

sybio.item_manager: 
     class:  %sybio.item_manager.class% 
     arguments: [@doctrine.orm.entity_manager, %sybio.item_manager.entity%, {'item_removed_state': %item_removed_state%, 'item_unpublished_state': %item_unpublished_state%, 'item_published_state': %item_published_state%}] 


// src/Sybio/Bundle/CoreBundle/Manager/ItemManager.php: 

public function __construct(EntityManager $em, $entityName, $params = array()) { 
    // ... 
    $this->params = $params; 
} 

Se si crea un BaseManager, è anche possibile creat EA utile metodo generico per inizializzare un oggetto:

// src/Sybio/Bundle/CoreBundle/Manager/BaseManager.php: 

/** 
* Create a new object 
* 
* @return mixed 
*/ 
public function createNewObject() 
{ 
    $entityName = explode(":", $this->entityName); 
    $entityName = "Sybio\Bundle\CoreBundle\Entity\\".$entityName[1]; 

    return new $entityName; 
} 
+0

Non si sta iniettando il gestore entità predefinito con "@ doctrine.orm.entity_manage"? – d0001

4

è necessario definire il vostro gestore di entità personalizzato come un servizio:

services: 
    name_of_your_custom_manager: 
     class: %doctrine.orm.entity_manager.class% 
     factory_service: doctrine 
     factory_method: getEntityManager 
     arguments: ["name_of_your_custom_manager"] 

Quindi, è possibile iniettare nello stesso modo come si fa con tutti i servizi :

@name_of_your_custom_manager 

Edit:

Prestare attenzione che il metodo factory può differire tra la versione di symfony (potrebbe essere getEntityManager o getManager)

2

Per coloro che utilizzano Symfony 3+ , utilizzare la console: php bin/console debug:container

Poi si dovrebbe vedere molte linee che iniziano con: 'doctrine.orm.MY_CUSTOM_ENTITY_MANAGER_xxxxxxxxxx'

Quindi, se si desidera che il soggetto responsabile corrisp aggiungendo al proprio gestore di entità personalizzato, trova la riga: 'doctrine.orm.MY_CUSTOM_ENTITY_MANAGER_entity_manager'

È possibile inserirlo negli argomenti del servizio.

Spero che aiuti.

Problemi correlati