2012-10-29 16 views
8

W Symfony2 można pracować z wieloma menedżerami jednostki i użyć coś jak poniższy kod:Jak wprowadzać inne niż domyślne menedżery encji?

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

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

możemy wstrzyknąć domyślnego menedżera do wszelkich usług za pomocą:

"@doctrine.orm.entity_manager" 

Jak można wprowadzić zakaz -default menadżerów encji do usług?

Odpowiedz

23

Jeśli menedżerowie jednostka nazwa config jest non_default wtedy można odwołać go jako @doctrine.orm.non_default_entity_manager

+0

Aby się upewnić, konieczne jest utworzenie go jako usługi. – d0001

+1

Nie trzeba tworzyć usługi. Symfony automatycznie je utworzy. To samo dotyczy połączeń. –

+1

Możesz również użyć polecenia 'php app/console container: debug', aby go zweryfikować. –

1

Witam przede wszystkim stworzyć swojego menedżera, w moim przykładzie tworzę menedżera dla mojej klasy elementu, który jest w 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 

} 

Jeśli struktura menedżer jest dzielona między stwardnieniem menedżera, można utworzyć BaseManager rozszerzony o wszystkich innych menedżerów!

następnie zarejestrować go w services.yml (lub XML) plik z Twojego wiązki:

# 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%] 

to wszystko można teraz używać go:

// Controller: 

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

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

Następnie można poprawić menedżera , tutaj podam tablicę parametrów konfiguracyjnych do mojego menedżera:

# 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; 
} 

Po utworzeniu menedżera BaseManager można również tworzyć Metoda ogólna EA Przydatne zainicjować obiektu:

// 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

Czy nie wstrzykujesz domyślnemu menedżerowi encji "@ doctrine.orm.entity_manage"? – d0001

4

należy zdefiniować niestandardową kierownika jednostki jako usługa:

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

Następnie można wprowadzić go w taki sam sposób, jak to zrobić z każdej usługi :

@name_of_your_custom_manager 

Edit:

Należy zwrócić uwagę, że metoda fabryka może się różnić pomiędzy wersją symfony (może to być getEntityManager lub getManager)

2

dla tych, którzy są przy użyciu Symfony 3+ należy użyć konsoli: php bin/console debug:container

Następnie powinieneś zobaczyć wiele linii zaczynające się od: „doctrine.orm.MY_CUSTOM_ENTITY_MANAGER_xxxxxxxxxx”

Więc jeśli chcesz CORRESP menedżera podmiot zwracając się do menedżera niestandardowego podmiotu, znajdź wiersz: 'doctrine.orm.MY_CUSTOM_ENTITY_MANAGER_entity_manager'

Możesz wstawić go do swoich argumentów usługi.

Mam nadzieję, że to pomaga.

Powiązane problemy