在Symfony2中,您可以使用多个实体管理器并使用类似下面的代码:
$em = $this->get('doctrine')->getManager();
$em = $this->get('doctrine')->getManager('default');
$customerEm = $this->get('doctrine')->getManager('customer');
我们可以使用以下命令将默认管理器注入任何服务:
"@doctrine.orm.entity_manager"
如何将非默认实体经理注入服务?
答案 0 :(得分:27)
如果您的实体经理的配置名称为non_default
,那么您可以将其引用为@doctrine.orm.non_default_entity_manager
答案 1 :(得分:4)
您应该将自定义实体管理器定义为服务:
services:
name_of_your_custom_manager:
class: %doctrine.orm.entity_manager.class%
factory_service: doctrine
factory_method: getEntityManager
arguments: ["name_of_your_custom_manager"]
然后,您可以按照与每项服务相同的方式注入它:
@name_of_your_custom_manager
修改强>:
请注意,symfony版本的工厂方法可能不同(可能是getEntityManager
或getManager
)
答案 2 :(得分:3)
对于使用Symfony 3+的用户,请使用控制台:
php bin/console debug:container
然后你会看到许多行以:'doctrine.orm.MY_CUSTOM_ENTITY_MANAGER_xxxxxxxxxx'
开头因此,如果您希望实体管理器对应于您的自定义实体管理器,请找到以下行: 'doctrine.orm.MY_CUSTOM_ENTITY_MANAGER_entity_manager'
您可以将其插入服务参数中。
希望它有所帮助。
答案 3 :(得分:1)
您好首先创建您的经理,在我的示例中,我为CoreBundle中的Item类创建管理器:
<?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
}
如果管理器结构在多个管理器之间共享,则可以创建由所有其他管理器扩展的BaseManager!
然后将其注册到捆绑包的services.yml(或xml)文件中:
# 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%]
就是这样,你现在可以使用它了:
// Controller:
$im = $this->get('sybio.item_manager');
$item = $im->createNewObject();
$im->save($item);
然后你可以改进你的经理,在这里我给我的经理提供一系列配置参数:
# 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;
}
如果您创建了BaseManager,您还可以创建一个有用的通用方法来初始化对象:
// 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;
}